locked
alternative zu AFIELDS(...) RRS feed

  • 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 Dragov

    Bitte 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:22
    Administrator
  • 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