Fragensteller
alternative zu AFIELDS(...)

Frage
-
hi allezamm
Wieder mal eine vll. dumme Frage.
Welche Alternative gibt es die Anzahl der Kommastellen eines numerischen Feldes zu ermitteln außer das ich umständlich per AFIELDS(...) und ASCAN(...) mir die Feldeigenschaften erst umständlich suchen muss?
TRANSFORM hilft mir da etwas wenig, denn
TRANSFORM(1234.100) bringt mir zwar die drei Nachkommastellen, aber TRANSFORM(1234.000) verschluckt die drei "0"-en.LG Mike
Dienstag, 19. Januar 2021 22:26
Alle Antworten
-
Hallo Mike,
In Visual FoxPro 9 entfernt die TRANSFORM-Funktion nachfolgenden Nullen aus der Nachkommastelle eines numerischen Werts, wenn alle nach dem Dezimalpunkt folgenden Zahlen Nullen sind. Weitere Informationen findest Du hier:
"TRANSFORM( ) Function" : Request for tests - comments for update vfp9 help file
Die Anzahl der Dezimalstellen hängt von der SET ([Dezimalstellen]) Funktion in Deinen Einstellungen ab, wie im folgenden Thread erwähnt:
If decimal is 0 then no decimal
Gruß,
Ivan DragovBitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
Mittwoch, 20. Januar 2021 17:22Administrator -
Da jede Wandlung auf nen Char die tatsächlichen Felddefinitionen ändert, bleibt dir nix anderes als die echten TabellenInfos auszulesen. Probiers mal damit:
FUNCTION GetFieldInfo(cAliasFeld, nInfo) ******************************************* * Gibt TabellenInfos zurück * cAliasFeld: [Alias.] Feldname * nInfo: 1 = Typ, 2 = Länge, 3 = Dezimalstellen usw bis 17 ******************************************* nInfo = EVL(nInfo,1) LOCAL cAlias, cFeld, aFelder(1) if "." $ cAliasFeld cAlias = JUSTSTEM(cAliasFeld) cFeld = JUSTEXT(cAliasFeld) ELSE cAlias = ALIAS() cFeld = cAliasFeld ENDIF RETURN AFelder(ASCAN(aFelder, cFeld, 1, AFIELDS(aFelder, cAlias), 1, 7)+nInfo) FUNCTION GetFieldInfo2(cFeld, nInfo, cAlias) ******************************************* * Gibt TabellenInfos zurück * cFeld: Feldname aus aktuellen Arbeitsbereich * nInfo: 1 = Typ, 2 = Länge, 3 = Dezimalstellen usw bis 17 * cAlias: Optional, für anderen Arbeitsbereich ******************************************* cAlias = EVL(cAlias, ALIAS()) nInfo = EVL(nInfo,1) LOCAL aFelder(1) RETURN AFelder(ASCAN(aFelder, cFeld, 1, AFIELDS(aFelder, cAlias), 1, 7)+nInfo)
Da hast 2 Varianten, die sich nur durch den Aufruf unterscheiden.wOOdy
Microsoft Visual FoxPro and Servoy Technology Advisor
Microsoft "Most Valuable Professional" from 1996 to 2009
Visit my XING profile, my LinkedIn profile, my Facebook page!*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`.Visual FoxPro: It's magic !
(¸.·``··*
Freitag, 5. März 2021 08:18 -
Danke...
So ähnlich hab ich das ja schon gelöst. Da ich nur ein paar wenige Num-Felder habe, wo ich die Dezimalstellen benötige, habe ich im INIT vom jeweiligen Daten.I/O die Strukturdaten der Tabelle geladen und mir die passenden Variablen generiert.
Im Date.I/O-Object ist eine Liste der Feldnamen hinterlegt, deren TRANSFORM-Maske benötigt wird. Die hol ich mir per AFIELDS raus und erzeuge PUBLIC-Variablen. Ebenso ist dort das Array für CREATE TABLE... vorhanden.
&& .DbfMskList = "Feldname1, Feldname2" && .DataStru Array für CREATE ... FROM ARRAY .DataStru FOR Ln_I = 1 TO GETWORDCOUNT(.DbfMskList, ",") Lc_Mask = ALLTRIM(GETWORDNUM(.DbfMskList, Ln_I, ",")) Ln_Offs = ASCAN(.DataStru, Lc_Mask, 1, 0, 1, 9) IF !EMPTY(Ln_Offs) Lc_Mask = "Msk_"+Lc_Mask PUBLIC (Lc_Mask) &Lc_Mask = ICASE( ; EMPTY(.DataStru(Ln_Offs, 4)), REPLICATE("9", .DataStru(Ln_Offs, 3)), ; REPLICATE("9", .DataStru(Ln_Offs, 3)-.DataStru(Ln_Offs, 4)-1) + "." + REPLICATE("9", .DataStru(Ln_Offs, 4))) ENDIF ENDFOR
lg mike
Freitag, 5. März 2021 19:57