PMS32 Online- Hilfereferenz
My - Globaler Handler der die komplette Struktur steuert
My wird in PMS32 ab Version 1.0.03 als "einzige" globale Variable betrachtet, unter der alle PMS32 Funktionen abgelegt sind. Damit entfallen alle anderen bisher benutzten "globalen" Variablen. In Scripten werden diese bei Aufruf des Scripts automatisch untersucht und ausgetauscht.
Beispiel:
_g_oPfade... war vorher der Pfadhändler
Jetzt:
My.Clients.Path...
My wird als ERSTER Handler beim Start jeder Applikation bzw. jedes Name Space Servers aktiviert, sofern noch nicht vorhanden. Danach stehen der Applikation alle Funktionen zur Verfügung, die in der My Struktur vorhanden sind.
Verwendet man die Funktionen in der My Struktur, so sollte man darauf achten, dass bei einem mehrmaligen Ausführen gleicher Strukturbäume die Zeit länger ist, wie wenn man sich die Klasse in eine lokale Variable holt!°
*/ Setzen des Pfades auf das Verzeichnis von PMS32 */ Je nach dem von welchem Pfad Sie PMS32 starten muss dann der Pfad abgeändert werden CD c:\pms32 */ Aktivieren von My unter VFP-9.0 My = NEWOBJECT("pmsmy","pmsmyhandler.vcx","pmsmyhandler.app") */ Setzen der Pfade auf den zuletzt gewählten Mandanten. Auch wenn der Befehl unsinnig aussieht... My.cIdx02 = My.cIdx02 */ Ab hier kann auf die komplette My Struktur zugegriffen werden */ Obiger Hinweis mit vielen Datensätzen.... */ Wir erstellen uns einen SQL, der mit "vielen" Datensätzen beladen ist... SELECT b01.artnr,CAST("" AS C(13)) AS barcode ; FROM (My.Clients.Path.cDbfDir+'b01.dbf') ; WHERE b01.artnr LIKE "SIE.%" ; INTO CURSOR qB01Test NOFILTER READWRITE */ Der obige Cursor kann eine ganze Menge Daten enthalten, jenachdem wieviele SIEMENS Artikel vorhanden sind... */ Wir wollen jetzt diesen Cursor mit EAN-Codes füllen, dazu nehmen wir uns die Methode: My.Clients.Numbers.EanCode(tcTable,tnAnzahl,tlEAN8) aus dem NameSpace... LOCAL t0,t1,t2,t3,t4 t0 = SECONDS() */ Ganz schlechtes Beispiel... SCAN REPLACE barcode WITH My.Clients.Numbers.EanCode("U99") ENDSCAN t1 = SECONDS() */ Schlechtes Beispiel... REPLACE ALL barcode WITH My.Clients.Numbers.EanCode("U99") t2 = SECONDS() */ Etwas besser... REPLACE ALL barcode WITH My.Clients.Numbers.EanCode("U99",RECCOUNT()) t3 = SECONDS() */ Best of... LOCAL loNumbers loNumbers = My.Clients.Numbers REPLACE ALL barcode WITH m.loNumbers.EanCode("U99",RECCOUNT()) t4 = SECONDS() */ Wir geben die Zeiten aus... WAIT WINDOW TRANSFORM(m.t1-m.t0)+"/"+TRANSFORM(m.t2-m.t1)+"/"+TRANSFORM(m.t3-m.t2)+"/"+TRANSFORM(m.t4-m.t3)
Action... : Abfrage für Action Handler aller AktionenAppForms. : Funktionen für Masken Enthält Steuerfunktionen für die MaskenBussines. : Geschäftsregeln Handler für alle Bussines Klassen in PMS32.CStructs. : Bearbeiten von C-Structures Bearbeitung von C-Strukturen neuer ArtClients.. : Alle Mandantenabhängigen Funktionen Zugriff auf alle Client (Pfad) COM+ Server und Klassen.Convert.. : Konvertierung Konvertierung verschiedener PMS32 InformationenData..... : Datenhandling Datenhandler von PMS für Im- und Exportfunktionen.Functions : Funktionen Steuert alle Funtktionen innerhalb von PMS. Speziell Funktionen, die allgemein gültig sind, wie Datum, Mathe, ...GDI...... : Grafikinterface GUI Steuerung des GDI+Globals.. : Golbale Informationen Enthält / Setzt globale Variablen für die Programmausführung.HdeForms. : Steuerung HDE Forms Steuerung der neuen Forms für HDE ZugriffNewClient : Neuer Client Wert:[Object], Gibt den Zeiger auf einen PMS32-Client zurück. Dieser CLient hat KEIN GUI! Er wird für Hintergrund Jobs verwendet!Systems.. : Systemfunktionen Enthält die Definitionen für die Systemumgebung.Timers... : Timerfunktionen Beinhaltet alle Timer Klassen, die in PMS benötigt werden.Wrapper.. : Ersetzungen Wrapper für alles Mögliche (Word, Excel, Filedialoge usw.)ctl32.... : GUI Erweiterungen CTL 32 Erweiterungen GUI (SEDNA)
Erstellt ein Array mit Programmstack Informationen
taArray = My.AProgram(taArray) taArray = My.AProgram(taArray)
*/ Array ermitteln LOCAL laStack[1],lni */ Gibt die Anzahl der enthaltenen Elemente im Array zurück IF My.aProgram(@laStack)>0 ACTIVATE SCREEN FOR m.lni = 1 TO ALEN(laStack) ? laStack(m.lni) MEXT m.lni ENDIF
Added eine Property an eine EMPTY Klasse oder andere incl. der Erzeugung einer Property _memberliste.
Rückgabe ist vom Typ Boolean!
Boolean = My.AddExtProperty(toObject AS Object,tcProperty AS String,tvValue AS Variant) Boolean = My.AddExtProperty(toObject,tcProperty,tvValue)
Rückgabe:[Object], Added eine Property an ein Objekt und gibt das Objekt zurück
Object = My.AddPropR(toObject AS OBJECT,tcProperty AS STRING,tvValue AS Variant) Object = My.AddPropR(toObject,tcProperty,tvValue)
*/ Beispiel: LOCAL loObject AS Object loObject = My.AddPropR(CREATEOBJECT("EMPTY"),"Name","Michael") ? loObject.Name
Gibt ein Object mit den Informationen der APP zurück.
Variant = My.AppGetFileObject(tcApplication AS String) Variant = My.AppGetFileObject(tcApplication)
Gibt ein Array mit den Informationen der APP zurück. Wie AGetFileVersion()
Variant = My.AppGetFileVersion(taArray , tcApplication AS String) Variant = My.AppGetFileVersion(taArray,tcApplication)
Boolean = My.AppendFile(tcFileV AS STRING , tcFileN AS STRING) Boolean = My.AppendFile(tcFileV,tcFileN)
tnFlags:
Bit-0 = 1, Kopieren wenn Ziel .NULL.
Bit-1 = 2, Kopieren wenn Ziel EMPTY
Bit-2 = 4, Immer kopieren
Wird KEIN Objekt 'nach' angegeben, so werden alle Properties kopiert!
Variant = My.CopyObject(toObjectV AS Object,toObjectN AS Object,tnFlags AS Integer) Variant = My.CopyObject(toObjectV,toObjectN,tnFlags)
Beispiel: LOCAL loVon AS Object, loNach AS Object loVon = CREATEOBJECT("EMPTY") =ADDPROPERTY(m.loVon,"Wert1","Michael") =ADDPROPERTY(m.loVon,"Wert2","Dirk") */ Erstellen einer kompletten Kopie loNach = My.CopyObject(m.loVon) */ Wenn loNach da ist... (Man achte auf Wert2!) loNach = CREATEOBJECT("EMPTY") */ Kopieren wenn NULL =ADDPROPERTY(m.loNach,"Wert2",.NULL.) =My.CopyObject(m.loVon,m.loNach,1) =Messagebox(My.Functions.fOTS.ObjectToString(m.loNach),64,"Kopieren wenn NULL") */ Kopieren wenn EMPTY =ADDPROPERTY(m.loNach,"Wert2",.NULL.) =My.CopyObject(m.loVon,m.loNach,2) =Messagebox(My.Functions.fOTS.ObjectToString(m.loNach),64,"Kopieren wenn EMPTY") */ Kopieren wenn NULL or EMPTY =ADDPROPERTY(m.loNach,"Wert2",.NULL.) =My.CopyObject(m.loVon,m.loNach,3) =Messagebox(My.Functions.fOTS.ObjectToString(m.loNach),64,"Kopieren wenn NULL or EMPTY") */ Immer kopieren =ADDPROPERTY(m.loNach,"Wert2",.NULL.) =My.CopyObject(m.loVon,m.loNach,4) =Messagebox(My.Functions.fOTS.ObjectToString(m.loNach),64,"Immer kopieren")
Wie CopyObject jedoch nur eine Ebene.
Variant = My.CopyObjectF(toObject AS OBJECT) Variant = My.CopyObjectF(toObject)
Rückgabe:[Boolean], Erzeugt eine Verzeichnisstruktur falls nicht vorhanden. Gibt .T. / .F. zurück ob das Verzeichnis existiert
Boolean = My.CreateDirectory(tcDir AS STRING) Boolean = My.CreateDirectory(tcDir)
LOCAL lcDir lcDir = "C:\TMP\TEST\TEST1" IF My.CreateDirectory(m.lcDir) */ jetzt müsste dieses Verzeichnis vorhanden sein! (Soweit die Rechte in WINDOWS bestehen!) ENDIF
Rückgabe: [Boolean], Löscht die angegebene Datei. Gibt .T. zurück, wenn erfolgreich...
Boolean = My.EraseFile(tcFile AS STRING) Boolean = My.EraseFile(tcFile)
*/ Falls diese Datei existiert... IF My.EraseFile(My.Clients.Path.cTmpDir+'test.txt') */ Dann wurde die Datei gelöscht ENDIF
Löschen einer VFP Standardtabelle, angefangen mit *.DBF, *.FPT, *.CDX,*BAK,*.TBK.
*.DBF - Tabelle
*.FPT - Memodatei
*.CDX - Indexdatei
*.BAK - Sicherung einer Tabelle (*.DBF)
*.TBK - Sicherung einer Memodatei (*.FPT)
Variant = My.EraseTable(tcTable AS String) Variant = My.EraseTable(tcTable)
*/ IF My.EraseTable(My.Clients.Path.cTmpDir+'test.dbf') */ Dann wurde die Tabelle gelöscht ENDIF
Ausführen eines VFP-Befehls mit EVALUATE().
Achtung! Eventuell müssen Variablen als PRIVATE deklariert werden!ENDTEXT
*
TEXT TO lcMessage NOSHOW TEXTMERGE
Ausführen eines VFP-Befehls mit EVALUATE().
Variant = My.Evaluate(tcExpression AS STRING) Variant = My.Evaluate(tcExpression)
*/ Mit Evaluate kann eine Befehlszeile ausgeführt werden */ Eventuell benutzte Variablen sind PRIVATE zu deklarieren PRIVATE pnVar1 AS Number , pnVar2 AS Number LOCAL lnVar AS Number STORE 2 TO pnVar1,pnVar2 lnVar = My.Evaluate([m.pnVar1+m.pnVar2]) WAIT WINDOW m.lnVar && Ergibt 4... ENDTEXT
Ausführen eines VFP-Scripts.
Variant = My.ExecScript(tcScript AS STRING) Variant = My.ExecScript(tcScript)
*/ Mit EXECSCRIPT kann ein VFP-Script ausgeführt werden LOCAL lcScript AS String,lnVar AS Number TEXT TO lcScript NOSHOW TEXTMERGE LOCAL laErg[1] , lnSelect AS Number lnSelect = SELECT() SELECT COUNT(*) FROM (My.Clients.Path.cDbfDir+'b01.dbf') WHERE b01.artnr='SIE.' INTO ARRAY laErg laErg[1] = IIF(_TALLY>0,laErg[1],0) SELECT(m.lnSelect) RETURN laErg[1] && Rückgabe ist die Anzahl der Datensätze ENDTEXT lnVar = My.ExecScript(m.lcScript) */ und das Ergebnis... WAIT WINDOW m.lnVar
Wenn man ein Berechnetes Feld darstellen möchte, deren Tabelle aber im Datenraster nicht zur Verfügung steht
Hier kann die Funktion GetCalcData("
Nehmen wir mal an, wir möchten der Einkaufspreis einer Bestellung im Datenraster der Maske I2001 anzeigen. Ein Beispiel:
_eg=iif(!EMPTY(i20sql.idd51),GetCalcData("o1=to.D51('%P1%%P2%');;o2=to.D40('%P1%');;return o1.menge_s*((o1.preis_f/o1.peek*(1-o1.rabatt/100)*(1-o1.rabatt1/100)+o1.edpreis)*(1-o2.ekrabatt/100))",i20sql.idd40,i20sql.idd51),0)
Wahnsinn, nehmen wir mal die Codezeile auseinander:
_eg = IIF(!EMPTY(I20SQL.IDD51),GetCalcData("
o1 = to.D51('%P1%%P2%') && Hier wird ein Datensatz der Tabelle D51 - Bestellpositionen geholt. %P1% wird durch I20SQL.IDD40 und %P2% wird durch I20SQL.IDD51 ersetzt
o2 = to.D40('%P1%') && Hier wird der Bestellkopfdatensatz (D40) zur Bestellposition geholt. %P1% wird durch I20SQL.IDD40 ersetzt
&& Jetzt die eigentliche Berechnung des EK's
return o1.menge_s * ( (o1.preis_f/o1.peek * (1-o1.rabatt/100) * (1-o1.rabatt1/100) + o1.edpreis ) * (1-o2.ekrabatt/100) )
Auch hier wird wieder to. durch My.Bussines.Strain.Misc.o ersetzt. Das to. muss IMMER kleingeschrieben werden!
Da die Codezeile aber in EINER Zeile der Definition gespeichert werden muss, werden Doppelt-Semikolon für die Definition eines Zeilenumbruchs genommen!
Das Semikolon MUSS/DARF nur bei der Funktion GetCalcData() verwendet werden!
Variant = My.GetCalcData(tcCode AS String , tcP1 AS STRING , tcP2 AS STRING , tcP3 AS STRING , tcP4 AS STRING) Variant = My.GetCalcData(tcCode,tcP1,tcP2,tcP3,tcP4)
Diese Funktion ist ähnlich GetMiscData, jedoch kann eine verschachtelte Abfrage getätigt werden.
Dazu wird eine 'kurze' Funktion genutzt, die entsprechend umgewandelt und ausgeführt wird.
Informationen:
Die Abkürzung to steht für TableObject und ist ein Zeiger auf My.Bussines.Strain.Misc
Danach folgt der Name der Tabelle, z.B.: b01
Der Parameter wird in eckigen Klammern übergeben: ['%P1%'] oder eine Funktion, die String zurückgibt!
Rückgabe ist immer die Variable hinter dem "." nach der Klammer.
Beispiel:
to.b01[[artnr='%P1%']].eknet1
MAN ACHTE AUF DOPPELKLAMMER UND EINZEL-HOCHKOMMA!
Wenn man die ID hat ist es einfacher:
tob01.['%P1%'].typnr
Die Parameter P1 - P4 werden in %Px% gesetzt und vor der Abfrage ausgetauscht
Alle Parameter MÜSSEN als String übergeben werden!
Die Funktionen GetCodeData() und GetMiscData() sind auch als reine Funktion in Main vorhanden!
Der Verschachtelte Datenabruf in einem Datenraster (Spezialspalte)
Die Funktion ist mit 'gleichem' Aufruf auch in Main gespeichert!
_kon=GetCodeData("to.c07(to.c09(to.c62(to.b01(to.i20("+'"idd40+idd51='+"'%P1%%P2%'"+'"'+").idb01).idc62).idc09).idc07).bezei",d51.idd40,d51.idd51)
Mit einer Funktion als Parameter wird die Sache triggi...
Variant = My.GetCodeData(tcCode AS STRING , tcP1 AS STRING , tcP2 AS STRING , tcP3 AS STRING , tcP4 AS STRING) Variant = My.GetCodeData(tcCode,tcP1,tcP2,tcP3,tcP4)
*/ Codebeispiel, My wird vorausgesetzt... */ 1. Wir haben die Vorgangsposition und möchten den Kontinent des Herstellers des Artikels wissen LOCAL lcKontinent AS String lcKontinent = My.GetCodeData("to.c07[to.c09[to.c62[to.b01['%P1%'].idc62].idc09].idc07].bezei",e11.idb01) */ Wir wandeln das obige Baispiel in einzelnen Abschnitte um: */ Die obige Formel wird von Innen nach Außen abgearbeitet: xIdc62 = My.Bussines.Strain.Misc.oB01[e11.idb01].idc62 && xIdc62 = to.b01['%P1%'].idc62 xIdc09 = My.Bussines.Strain.Misc.oC62[xIdc62].idc09 && xIdc09 = to.c62[xIdc62].idc09 xIdc07 = My.Bussines.Strain.Misc.oC09[xIdc09].idc07 && xIdc07 = to.c09[xIdc09].idc07 lcKontinent = My.Bussines.Strain.Misc.oC07[xIdc07].bezei && lcKontinent = to.c07[xIdc07].bezei */ to steht für: My.Bussines.Strain.Misc */ Nachfolgend die Tabelle getrennt durch "." .b01 => .oB01 */ Danach kommt die ID der Tabelle als Parameter in eckigen Klammern: [e11.idb01] */ Jetzt benötigen wird nur noch der Rückgabewert getrennt durch "." .idc62 */ Die Funktion in Erklärung: */ TableObject(to).Table(b01)['Primärschlüssel'].Feldname(idc62) */ Durch die kurze Schreibweise kann man auch lange Verschachtelungen erzeugen... */ Wenn man eine Funktion zusammensetzen muss: LOCAL lcKontinent AS String lcKontinent = My.GetCodeData(My.GetCodeData("to.c07[to.c09[to.c62[to.b01[to.i20[[idd40+idd51='%P1%%P2%']].idb01].idc62].idc09].idc07].bezei",d51.idd40,d51.idd51) */ MAN ACHTE AUF DIE DOPPELKLAMMER INNERHALB to.i20[[...Funktion...]].idb01 */ Falls man nur die Artikelnummer hat: LOCAL lcKontinent AS String lcKontinent = My.GetCodeData("to.c07[to.c09[to.c62[to.b01[[artnr='%P1%']].idc62].idc09].idc07].bezei",e11.artnr) */ Wenn man das Objekt benötigt: LOCAL loC07 AS Object loC07 = My.GetCodeData("to.c07[to.c09[to.c62[to.b01['%P1%'].idc62].idc09].idc07]",e11.idb01) */ oder... loC07 = My.GetCodeData(My.GetCodeData("to.c07[to.c09[to.c62[to.b01[to.i20[[idd40+idd51='%P1%%P2%']].idb01].idc62].idc09].idc07]",d51.idd40,d51.idd51) */ oder... loC07 = My.GetCodeData("to.c07[to.c09[to.c62[to.b01[[artnr='%P1%']].idc62].idc09].idc07]",e11.artnr) */ loC07 ist ein Objekt des Datensatzes der Tabelle C07! */ Der Verschachtelte Datenabruf in einem Datenraster (Spezialspalte) */ Die Funktion ist mit 'gleichem' Aufruf auch in Main gespeichert! _kon=GetCodeData("to.c07(to.c09(to.c62(to.b01(to.i20("+'"idd40+idd51='+"'%P1%%P2%'"+'"'+").idb01).idc62).idc09).idc07).bezei",d51.idd40,d51.idd51) */ Mit einer Funktion als Parameter wird die Sache triggi... */ Obige Funktion wird in den Datenraster Tabellen X60/X61/X62 in eckigen Klammern als String gespeichert, weshalb keine solche Klammern verwendet werden dürfen. ControlSource = [_kon=GetCodeData("to.c07(to.c09(to.c62(to.b01(to.i20("+'"idd40+idd51='+"'%P1%%P2%'"+'"'+").idb01).idc62).idc09).idc07).bezei",d51.idd40,d51.idd51)] wait window m.ControlSource */ Es geht auch einfacher und schneller... _kon=GetCodeData("to.c07(to.c09(to.c62(to.b01('%P1%).idc62).idc09).idc07).bezei",d51.idb01)
Wenn ein Feld aus einer Tabelle ermittelt werden muss, die im Datenraster nicht zur Verfügung steht
Hier kann die Funktion GetMiscData("
_k10match = GetMiscData("oK10",I20SQL.IDK10,"match")
Im Datenraster der Maske I2001 wird der Matchcode zum Projekt ermittelt.
'oK10' gibt die Property unter My.Bussines.Strain.Misc an, deren Daten abgerufen werden sollen: My.Bussines.Strain.Misc.oK10
'I20SQL.IDK10' gibt den Primärschlüssel der Projekttabelle (K10) an: My.Bussines.Strain.Misc.oK10[I20SQL.IDK10]
'match' gibt den Feldnamen der Projekttabelle an, der abgerufen werden soll: My.Bussines.Strain.Misc.oK10[I20SQL.IDK10].match
Mit der Funktion kann aber auch eine Funktion an My.Bussines.Strain.Misc abgerufen werden... dies klappt bei der nächsten neuen Funktion nicht:
Variant = My.GetMiscData(tcObj AS STRING,tcId AS STRING,tcField AS STRING,tvP2 AS Variant,tvP3 AS Variant,tvP4 AS Variant,tvP5 AS Variant) Variant = My.GetMiscData(tcObj,tcId,tcField,tvP2,tvP3,tvP4,tvP5)
Wenn ein Feld aus einer Tabelle ermittelt werden muss, die im Datenraster nicht zur Verfügung steht und man wie unter GetMiscData() über eine Objektabfrage einen Wert haben möchte...
Über die Funktion GetMiscValue("
Die entsprechende Funktion in My: My.GetMiscValue(...), Ein Beispiel:
_k10match = GetMiscValue("K10",I20SQL.IDK10,"match")
Eine Besonderheit ist die Rückgabe eines Datensatz-Objekts
oK10 = GetMiscValue("K10",I20SQL.IDK10)
Mit dieser Funktion können lediglich die Properties unter My.Bussines.Strain.Misc.oXXX abgerufen werden!
Variant = My.GetMiscValue(tcObj AS STRING,tcId AS STRING,tcField AS STRING) Variant = My.GetMiscValue(tcObj,tcId,tcField)
Wandelt übergebene Parameter in eine Collection um.
Umkehrfunktion zu SetParameters.
Collection = My.GetParameters(tvP1 AS Variant,tvP2 AS Variant,tvP3 AS Variant,tvP4 AS Variant,tvP5 AS Variant,tvP6 AS Variant,tvP7 AS Variant,tvP8 AS Variant,tvP9 AS Variant) Collection = My.GetParameters(tvP1,tvP2,tvP3,tvP4,tvP5,tvP6,tvP7,tvP8,tvP9)
*/ Hier können mehrere Parameter in eine Collection übertragen werden LOCAL loCollection AS Collection , lni AS Integer , lcNames AS String loCollection = My.GetParameters(1,DATE(),TIME()) WAIT WINDOW m.loCollection.Count && Anzahl der Werte (3) */ Die Namen der Parameter bestimmen lcNames = "" FOR m.lni = 1 TO m.loCollection.Count lcNames = m.lcNames + ";" + m.loCollection.GetKey(m.lni) NEXT m.lni WAIT WINDOW SUBSTR(m.lcNames,2)
Wandelt übergebene Parameter in eine Collection um.
Jedoch wird als 'erster' Parameter die Anzahl der Parameter mitgegeben.
Collection = My.GetParametersCount(tnCnt AS Number,tvP1 AS Variant,tvP2 AS Variant,tvP3 AS Variant,tvP4 AS Variant,tvP5 AS Variant,tvP6 AS Variant,tvP7 AS Variant,tvP8 AS Variant,tvP9 AS Variant) Collection = My.GetParametersCount(tnCnt,tvP1,tvP2,tvP3,tvP4,tvP5,tvP6,tvP7,tvP8,tvP9)
*/ Hier können mehrere Parameter in eine Collection übertragen werden */ Als Beispiel kann nur der Aufruf eines Scripts / einer Methode dienen LPARAMETERS tp1 AS Variant , tp2 AS Variant , tp3 AS Variant && Es könnten mehr sein! LOCAL loCollection AS Collection , lni AS Integer lni = PCOUNT() && Wieviele Parameter wurden übergeben? loCollection = My.GetParametersCount(m.lni,m.tp1,m.tp2,m.tp3) WAIT WINDOW m.loCollection.Count && Anzahl der Werte (?)
Rückgabe:[String], Gibt ein Stacklog im Stringformat zurück.
String = My.GetStackLog(tlLine AS Boolean) String = My.GetStackLog(tlLine)
Rückgabe:[String], Rückgabe des Programmstacks in kurzer Schreibweise
String = My.GetStckShort(tnDeep AS Integer) String = My.GetStckShort(tnDeep)
Variant = My.GetSwitchValue(tcIP AS String,tcID AS String) Variant = My.GetSwitchValue(tcIP,tcID)
Rückgabe:[Boolean], wie cLogTextAdd, jedoch wird eine Methode verwendet. Füllt das Array My.aLogs[n,3] mit Informationen.
Boolean = My.LogTextAdd(tvValue AS Variant) Boolean = My.LogTextAdd(tvValue)
=My.LogTextAdd("Dies ist ein Test...") ? My.LogsCount IF My.LogsCount>0 ? My.aLogs[1,1],My.aLogs[1,2],My.aLogs[1,3] */ Struktur von My.aLogs[n,3] */ [n,1] = "C" - Text */ [n,2] = "T" - DateTime() */ [n,3] = "N" - Seconds() ENDIF
Tauscht die Informationen von vValue1 und vValue2. Rückgabe ist IMMER .T.
Kann in DO CASE ... ENDCASE Konstrukten verwendet werden...
Variant = My.MirrorValues(tvValue1 AS Variant @,tvValue2 AS Variant @) Variant = My.MirrorValues(@tvValue1,@tvValue2)
*/ Beispiel LOCAL lvValue1 AS Variant, lvValue2 AS Variant lvValue1 = "Michael" lvValue2 = DATE() =My.MirrorValues(@lvValue1,@lvValue2) ? lvValue1 && Enthält DATE() ? lvValue2 && Enthält "Michael"
Rückgabe:[Variant], Wie MirrorValues, jedoch mit Rückgabe einer Value.
Diese Methode ist ähnlich MirrorValues() jedoch wird eine der beiden Values nach dem Tausch zurückgegeben!
Variant = My.MirrorValuesR(tvValue1 AS Variant @,tvValue2 AS Variant @,tlSecondValue AS Boolean) Variant = My.MirrorValuesR(@tvValue1,@tvValue2,tlSecondValue)
*/ Beispiel: LOCAL lvValue1 AS Variant , lvValue2 AS Variant lvValue1 = "Michael" lvValue2 = DATE() */ Rückgabe von lvValue2 also Date ? My.MirrorValuesR(@lvValue1,@lvValue2,.F.) lvValue1 = "Michael" lvValue2 = DATE() */ Rückgabe von lvValue1 also Michael ? My.MirrorValuesR(@lvValue1,@lvValue2,.T.) */ Anmerkung: Die Inhalte werden erst getauscht, danach wird entschieden, welche Variable zurückgegeben wird.
Abgekürzte Function aus My.Clients.Action.ReadFieldInit
Variant = My.ReadFieldInit(toField AS TEXTBOX) Variant = My.ReadFieldInit(toField)
Setzt globale Informationen zurück.
Beispiel: "Zurücksetzen aller C-Strukturen"
Wird intern verwendet!
Variant = My.ResetBufferedInfos(tvWhat AS Variant) Variant = My.ResetBufferedInfos(tvWhat)
Wandelt eine übergebene Collection in Parameter um.
Umkehrfunktion zu GetParameters.
Variant = My.SetParameters(toPara AS Collection,tvP1 AS Variant @,tvP2 AS Variant @,tvP3 AS Variant @,tvP4 AS Variant @,tvP5 AS Variant @,tvP6 AS Variant @,tvP7 AS Variant @,tvP8 AS Variant @,tvP9 AS Variant @) Variant = My.SetParameters(toPara,@tvP1,@tvP2,@tvP3,@tvP4,@tvP5,@tvP6,@tvP7,@tvP8,@tvP9)
*/ Umwandeln einer Collection in Parameter LOCAL loCollection AS Collection,lnVar1 AS Number,lnVar2 AS Number loCollection = CREATEOBJECT("Collection") =loCollection.Add(1,"tvp1") =loCollection.Add(2,"tvp2") =My.SetParameters(m.loCollection,@lnVar1,@lnVar2) WAIT WINDOW m.lnVar1 WAIT WINDOW m.lnVar2
Rückgabe der Methode ist IMMER .T.!
Kann in DO CASE ... ENDCASE Konstrukten genutzt wreden...
Logical = My.SetValue(tvVonValue AS Variant , RvAnValue AS Variant @) Logical = My.SetValue(tvVonValue,@RvAnValue)
*/ Beispiel: LOCAL cValue AS String =My.SetValue("Michael"+" "+"Bergner",@cValue) WAIT WINDOW cValue */ Diese Funktion kan in CASE ... ENDCASE Konstrukten genutzt werden! */ Beispiel: LOACL vValue1,vValue2 DO CASE CASE !My.SetValue("Michael",@vValue1) * Kommt hier nie an! CASE ... CASE !My.SetValue(DATE(),@vValue2) * Kommt hier nie an! CASE ... OTHERWISE ... ENDCASE
Wie SetValue, jedoch wird der Wert der Value zurückgegeben!
Variant = My.SetValueR(tvVonValue AS Variant , RvAnValue AS Variant @) Variant = My.SetValueR(tvVonValue,@RvAnValue)
*/ Beispiel: LOCAL lnZahl AS Number IF My.SetValueR(2+3,@lnZahl)>=5 */ Ist... ELSE */ Ist nicht... ENDIF
Diese Funktion kann nur im Entwicklungsmodus genutzt werden!
Variant = My.SuspendPms(tlDebugger AS Boolean,tlSession AS Boolean) Variant = My.SuspendPms(tlDebugger,tlSession)
Mit dieser Funktion kann der Inhalt einer Variablen verglichen werden.
Für die korrekte Rückgabe kann ein Standardwert angegeben werden.
Zusätzlich besteht die Möglichkeit auch NULL Werte mit einem Standard vorzubelegen.
Variant = My.TVL(tvValue AS Variant , tvDefault AS Variant , tlNullAsDefault AS Boolean) Variant = My.TVL(tvValue,tvDefault,tlNullAsDefault)
*/ Ein Beispiel LOCAL lvReturn AS Variant */ Ausgabe 25 WAIT WINDOW My.TVL('',25) */ Ausgabe 33 WAIT WINDOW My.TVL(33,25) */ Ausgabe 44 WAIT WINDOW My.TVL(.NULL.,44,.T.)
Mit dieser Funktion kann der Inhalt einer Variablen verglichen werden.
Für die korrekte Rückgabe kann ein Standardwert angegeben werden.
Zusätzlich besteht die Möglichkeit auch NULL Werte mit einem Standard vorzubelegen.
Variant = My.TYVL(tcVariable AS String,tvDefault AS Variant, tlNullAsDefault AS Boolean) Variant = My.TYVL(tcVariable,tvDefault,tlNullAsDefault)
*/ Diese Funktion ist der Funktion TVL ähnlich! */ Beispiel: PRIVATE pcTest AS String pcTest = "Michael" */ Ausgabe 25 WAIT WINDOW My.TYVL("m.pcTest",25,.T.) */ HINWEIS: Die angegebene Variable MUSS als PUBLIC oder PRIVATE deklariert sein!
Rückgabe:[String], Testet ein Verzeichnis ob dieses Vorhanden ist und legt auch ein neues Verzeichnis an soweit möglich.
String = My.TestDirectory(tcDir AS String,tlEmpty AS Boolean,tlCreate AS Boolean) String = My.TestDirectory(tcDir,tlEmpty,tlCreate)
LOCAL lcDir lcDir = My.TestDirectory("c:\tmp\test1\",.T.,.T.) IF !EMPTY(m.lcDir) */ Dann wurde das Verzeichnis angelegt! ENDIF */ Hinweis! */ Wird der zweite Parameter mit .F. angegeben und konnte das Verzeichnis NICHT angelegt werden, so wird: lcDir = "*c:\tmp\test1\" */ zurückgegeben! Der * am Anfang signalisiert dann, dass das Verzeichnis nicht existiert bzw. */ nicht angelegt werden konnte.
Protokollieren von Laufzeiten. Aufruf mit: vValue=My.TimeCheck(SECONDS(),Method(....)[,cInfo])
,cInfo = My.TimeCheck(SECONDS_ AS NUMBER,tvValue AS Variant,tcInfo AS STRING) ,cInfo = My.TimeCheck(SECONDS_,tvValue,tcInfo)
Schreiben des Protokolls in eine Datei. =My.TimeWrite(cFileName[,cInfo])
,cInfo = My.TimeWrite(tcFile AS String,tcInfo AS String) ,cInfo = My.TimeWrite(tcFile,tcInfo)
Wartet eine bestimmte Zeit in Sekunden.
Geht in allen Programmumgebungen...
Variant = My.Wait(tnSeconds AS NUMBER) Variant = My.Wait(tnSeconds)
*/ Beispiel... ? TIME() =My.Wait(3) */ Wartet 3 Sekunden bevor der Befehl abgearbeitet wird ? TIME() */ HINWEIS: */ Diese Funktion funktioniert auch in einer NameSpace DLL!
Rückgabe:[Boolean], Wie Wait Window
Geht nur unter GUI Bedingungen!
Boolean = My.WaitWIndow(tv1,tv2) Boolean = My.WaitWIndow(tv1,tv2)
Wartet so lange, bis eine Datei verschwunden ist. Abbruch nach 100 Sekunden...
Variant = My.WaitWhileFile(tcFile AS STRING,tnAttempts AS Number) Variant = My.WaitWhileFile(tcFile,tnAttempts)
*/ Beispiel LOCAL llNotFile */ Wir warten nur 5 Sekunden! Der zeite Parameter ist optional! llNotFile = My.WaitWhileFile(My.Clients.Path.cTmpDir+'test.txt',5) IF m.llNotFile ? "Datei gibt es nicht (mehr)" ELSE ? "Die Datei ",My.Clients.Path.cTmpDir+'test.txt'," existiert noch!" ENDIF
Schreiben des BackGround Log's. Die Informationen werden in die Datei: BackGround.log geschrieben, wenn My.lWriteLog=.T.
Variant = My.WriteBGLog(tcProgram AS String,tcText AS String) Variant = My.WriteBGLog(tcProgram,tcText)
Variant = My.WriteFSLog(tcText AS STRING,tlOffset AS Boolean) Variant = My.WriteFSLog(tcText,tlOffset)
Gleiches wie WriteInLogIf() jedoch wird immer geschrieben unabhängig von der Einstellung My.lWriteLog.
Variant = My.WriteInLog(tcText AS STRING,tlNoDate AS Boolean,tcFile AS STRING,tlOverWrite AS Boolean) Variant = My.WriteInLog(tcText,tlNoDate,tcFile,tlOverWrite)
*/ Ohne Datum/Zeit =My.WriteInLog("Text",.T.,"MyOwn.log",.F.) */ Mit Datum/Zeit =My.WriteInLog("Text",.F.,"MyOwn.log",.F.) */ Nur Zeit =My.WriteInLog("Text",.NULL.,"MyOwn.log",.F.)
Gleiches wie WriteInLog() jedoch wird nur geschrieben abhängig von der Einstellung My.lWriteLog.
Boolean = My.WriteInLogIf(tcText AS STRING,tlNoDate AS Boolean,tcFile AS STRING,tlOverWrite AS Boolean) Boolean = My.WriteInLogIf(tcText,tlNoDate,tcFile,tlOverWrite)
*/ Ohne Datum/Zeit =My.WriteInLogIf("Text",.T.,"MyOwn.log",.F.) */ Mit Datum/Zeit =My.WriteInLogIf("Text",.F.,"MyOwn.log",.F.) */ Nur Zeit =My.WriteInLogIf("Text",.NULL.,"MyOwn.log",.F.)
Wie WriteInLog, jedoch mit zweitem Info-Parameter.
Variant = My.WriteInSLog(tcText AS STRING,tcInfo AS String,tlNoDate AS Boolean,tcFile AS STRING,tlOverWrite AS Boolean) Variant = My.WriteInSLog(tcText,tcInfo,tlNoDate,tcFile,tlOverWrite)
*/ Ohne Datum/Zeit =My.WriteInSLog("Text","Info",.T.,"MyOwn.log",.F.) */ Mit Datum/Zeit =My.WriteInSLog("Text","Info",.F.,"MyOwn.log",.F.) */ Nur Zeit =My.WriteInSLog("Text","Info",.NULL.,"MyOwn.log",.F.)
Schreibt ein LOG mit... und zwar IMMER auch wenn best. ENV Variablen NICHT gesetzt sind...
Variant = My.WriteLog(tcText AS STRING,tlNoDate AS Boolean,tlOverWrite AS Boolean) Variant = My.WriteLog(tcText,tlNoDate,tlOverWrite)
Schreibt ein LOG mit wenn PMSWRITELOG=ON. Siehe auch THIS.WriteLog()
Variant = My.WriteLogIf(tcText AS STRING,tlNoDate AS Boolean,tlOverWrite AS Boolean) Variant = My.WriteLogIf(tcText,tlNoDate,tlOverWrite)
Rückgabe:[Boolean], Schreibt die Informationen aus THIS.aLogs[n,3] in eine Datei. tnWhat=>Bitpattern. 0-WithDate,1-WithSeconds,2-WithTime
Boolean = My.WriteLogText(tnWhat AS INTEGER,tcFile AS STRING) Boolean = My.WriteLogText(tnWhat,tcFile)
Schreibt alle LOG Informationen in die PMSALL.LOG Datei. NUR wenn PMSWRITELOG="ON"
Variant = My.WriteSameLog(tcText AS STRING,tlNoDate AS Boolean,tlOverWrite AS Boolean) Variant = My.WriteSameLog(tcText,tlNoDate,tlOverWrite)
Siehe WriteSameLog() incl. Prüfung.
Variant = My.WriteSameLogIf(tcText AS STRING,tlNoDate AS Boolean,tlOverWrite AS Boolean) Variant = My.WriteSameLogIf(tcText,tlNoDate,tlOverWrite)
Schreiben eines StackLogs, wenn THIS.lWriteLog=.T.
Variant = My.WriteStackLogIf(tcProgram AS STRING) Variant = My.WriteStackLogIf(tcProgram)
Variant = My._MenuClick(tvIndex1 AS Variant,tnIndex2 AS NUMBER) Variant = My._MenuClick(tvIndex1,tnIndex2)
Variant = My._MenuEnabled(tvIndex1 AS Variant,tnIndex2 AS NUMBER) Variant = My._MenuEnabled(tvIndex1,tnIndex2)
Abruf der LIC mit direktem Zugriff
Variant = My.aMLic(tvIndex1 AS Variant,tnIndex2 AS NUMBER) Variant = My.aMLic(tvIndex1,tnIndex2)
Abfrage der Rechte für eine Form des angemeledeten Benutzers. Rückgabe ist entweder Integer oder String!.
Variant = My.aMRights(tcForm AS STRING,tlAsInteger AS Boolean) Variant = My.aMRights(tcForm,tlAsInteger)
*/ Beispiel LOCAL lcRights AS String,liRights AS Integer lcRights = My.aMRights("B0101",.F.) liRights = My.aMRights("B0101",.T.) */ Rechte im String: (Entsprechende Stelle enthält "X") */ 1 - Ansehen */ 2 - Ändern */ 3 - Neuanlage */ 4 - Löschen */ 5 - Drucken */ Gilt auch für den Integerwert: (Entspechende Stelle enthält 1) IF BITTEST(m.liRights,1) */ Dann darf er zumindest ansehen... ENDIF
Abfrage der Felder in einer HDM Maske, ob div. Codes noch durchlaufen werden dürfen. Hier geht es um das FormSet. Wird nur in HDM Masken benötigt.
Boolean = My.lEndForm(toForm AS Form) Boolean = My.lEndForm(toForm)
Variant = My.oIm(tcS AS STRING,toT AS OBJECT,tcN AS STRING,tlId AS Boolean,tvp1,tvp2,tvp3,tvp4,tvp5,tvp6,tvp7,tvp8,tvp9) Variant = My.oIm(tcS,toT,tcN,tlId,tvp1,tvp2,tvp3,tvp4,tvp5,tvp6,tvp7,tvp8,tvp9)
Variant = My.oImh(tcS AS STRING,toT AS Object,tcN AS String,tlId AS Boolean,tvp1,tvp2,tvp3,tvp4,tvp5,tvp6,tvp7,tvp8,tvp9) Variant = My.oImh(tcS,toT,tcN,tlId,tvp1,tvp2,tvp3,tvp4,tvp5,tvp6,tvp7,tvp8,tvp9)
Variant = My.oIn(tcS AS STRING,toT AS Object,tcN AS String,tlId AS Boolean,tvp1,tvp2,tvp3,tvp4,tvp5,tvp6,tvp7,tvp8,tvp9) Variant = My.oIn(tcS,toT,tcN,tlId,tvp1,tvp2,tvp3,tvp4,tvp5,tvp6,tvp7,tvp8,tvp9)
Ist .T., wenn GETENV("PMSWRITELOG")="PMS32HX". Auf diese Einstellung wird im gesamten System reagiert! Ist der Wert auf .T. gesetzt, so werden auch in den Namespaces Logs geschrieben.
Boolean = My.LBGPlog
Object = My.OutFHTM
Wert:[Object], Gibt ein PrivateDataSesion Objekt zurück.
Object = My.PrivateSession
LOCAL loSession AS DataSession loSession = My.PrivateSession
Name der Scriptdatei, die bei der Zuweisung der Mandanten-ID nachgeladen wird.
String = My.ScriptFile
*/ ScriptFile wird eigentlich intern benötigt! */ Hier nur ein Beispiel... */ My sollte bekannt sein... My.ScriptFile = "MeineScriptDatei.Define" && Die Datei muss in sys\mysys\ existieren! */ Zuweisen der Mandanten-ID My.cIdx02 = My.cIdx02
Gibt die CLSID der COM Klasse zurück.
String = My._ComClsId
Enthält die DataSessionId des COM+ Servers, der diese Klasse erstmalig aktiviert hat! Wird für die Speicherbelegung benötigt...
Number = My._Datasession
Verzeichnis der LOG Dateien, wird aus dem Startpfad ermittelt...
String = My._LogDir
LOG Datei, die eventuell geschrieben wird. Wird vom Programmnamen abgeleitet.
String = My._LogFile
Rückgabe:[Variant], Kurzform von My.AppForms.Menues.Item("....") Kann in Menüs verwendet werden!
Boolean = My._MenuesItem[tcIndex1 AS String | tiIndex1 AS Integer , tiIndex2 AS Integer] Boolean = My._MenuesItem[tcIndex1|,tiIndex1,tiIndex2]
LOCAL llEnabled llEndabled = My._MenusItem("SYSMENU._PRECORD._SAVE.Enabled")
Dateiname der Applikation. Wenn unter Vfp gestartet wird! sind diese Werte NICHT gesetzt! Die Property _Name gibt den Klassennamen der EXE bzw. DLL zurück.
Mit diesem Namen und dem Namen der EXE/DLL kann dann die COM+ Klasse instanziiert werden. Gleiches kann man auch aus den Eigenschaften der Programmklasse
EXE/DLL herausfinden.
String = My._Name
LOCAL lcComName AS String lcComName = My._Name WAIT WINDOW m.lcComName
Pfad der Applikation bzw. des COM+ Servers. ACHTUNG! My wird auch im COM Server als Public Variable definiert!
String = My._Path
Die Property gibt den Startmodus des Aufrufers zurück. Es gibt insgesamt 6 Modi:
0 - Unter VFP Entwicklung
1 - Unter VFP-COM Steuerung
2 - Start als COM.EXE
3 - Start als COM.DLL in Singleprocess
4 - Start als EXE (Standard Programmaufruf)
5 - Start als COM.DLL in Multiprocess
Number = My._StartMode
*/ Abfrage des Modus WAIT WINDOW My._StartMode
Nummer des Externen Starts vom Handler. Wird intern verwendet
Number = My._StartNumber
Computername aus SYS(0) in Großschrift.
String = My._Terminal
LOCAL lcTerminal lcTerminal = UPPER(ALLTRIM(GETWORDNUM(SYS(0),1,"#"))) IF m.lcTerminal==My._Terminal */ Dann wars korrekt berechnet... ENDIF
Systembenutzer aus SYS(0) in UPPER()
String = My._User
LOCAL lcUser lcUser = UPPER(ALLTRIM(GETWORDNUM(SYS(0),2,"#"))) IF m.lcUser==My._User */ Dann wars korrekt berechnet... ENDIF
Versionsnummer nach PMS32 Konvention. H.U.DD.SSHH.bbbb
Die Property _Version gibt die Programmversion (gilt für DLL, EXE und auch für APP) zurück.
H - Hauptversion
U - Unterversion
DD - Datenbankversion
SS - Servicepack
HH - Hotfix
bbbb- Buildnumber
String = My._Version
WAIT WINDOW My._Version
VFP Version der VFP-9 dll.
String = My._VfpVersion
WAIT WINDOW My._VfpVersion
Ist .T., wenn My unter COM+ gestartet wurde.
Interne Verwendung
Boolean = My._lComStart
Array für den Zugriff von cLogTextAdd...
Wird intern verwendet, wenn LOG's mitgeschrieben werden.
Array = My.aLogs[tiIndex1 AS Integer , tiIndex2 AS Integer] Array = My.aLogs[tiIndex1,tiIndex2]
Zähler für aLogs(n,m). Siehe auch WriteLogText()
Wird intern verwendet, wenn LOG's mitgeschrieben werden.
Array = My.aLogsCount
Speichert Zeitdaten / Durchlaufzeiten von Methoden bzw. Berechnungen.
Wird intern verwendet, wenn LOG's mitgeschrieben werden.
Array = My.aTimes[tiIndex1 AS Integer , tiIndex2 AS Integer] Array = My.aTimes[tiIndex1,tiIndex2]
Zähler von THIS.aTimes(n,m)
Wird intern verwendet, wenn LOG's mitgeschrieben werden.
Array = My.aTimesCount
Rückgabe: [String], gibt den Wert für m.brow_for zurück, soweit definiert ansonsten Leerstring.
String = My.cBrowFor
LOCAL lcFilter lcFilter = My.cBrowFor
String = My.cClassHelp
Eingestellte Sprache des PMS32 Systems
Die Einstellung wird über PMS_00.DLL vorgenommen
String = My.cIdc26
WAIT WINDOW My.cIdc26
Reportsprache. Es wird m.g_rsprache abgefragt. Wird die Sparche in Reports abgefragt, so sollten Sie My.cIdc26R benutzen und NICHT mehr die alte Variable m.g_rSprache!
String = My.cIdc26R
Mandanten-ID. Diese ist in der Datei pms32.pth gespeichert und dient dort zur Zuordnung des Mandante und dessen Pfade.
Auszug aus der Pfaddatei pms32.pth:
*/ Verzeichnis der Microcube - Dateien. Wenn leer dann gleich: cDbfdir
cCubdir = ""
*/ Ein 'anderes' Dokumentenverzeichnis kann angegeben werden. Wenn nicht angegeben dann gleich: cDbfdir+'docs\'
*/ cDocDir = ""
*/ Verzeichnis der Mandantentabellen. Hier ein Beispiel mit UNC Pfaden.
*/ Wird die Freigabe auf dem Server 'versteckt' \pms$\ angegeben, so kann ein Cryptovirius das Verzeichnis nicht finden!
cDbfdir = "\\server\pms$\pms32\daten\demo.32\"
*/ Verzeichnis der Reporttabellen
*/ Gibt man Bilddateien in einem Report mit My.Clients.Path.cFrxDir+'BILDNAME.JPG' an, so kann PMS32 einfach auf einen anderen Rechner kopiert werden!
cFrxdir = "\\server\pms$\pms32\reports\demo.32\"
*/ Beschreibung des Mandanten
cIcx02 = "TESTMANDANT DEMO"
*/ ID der Firmenparameter zum Mandant.
cIdx09 = "DEMO"
*/ Kann unter der Mandanteninformation leer sein, wenn für mehrere Mandanten das 'gleiche' Systemverzeichnis gültig ist.
cSysdir = ""
*/ Willkommens-Information als Hintergrundbild in PMS32
cWelcome= "pms32.htm"
*/ Nummer des Mandanten, beim Einsatz eines BarcodeScanners sollte diese Nummer EINDEUTIG sein!
nNumber = 1
<>
String = My.cIdx02
*/ Abfrage der Mandanten-ID WAIT WINDOW My.cIdx02 */ Wenn man mittels VFP Zugriff auf die Applikation braucht: */ 1. vfp9.exe öffenen */ 2. In das Startverzeichnis von PMS32 wechseln (MUSS) CD c:\pms\pms32 */ 3. My Instanziieren My = NEWOBJECT("pmsmy","pmsmyhandler.vcx","pmsmyhandler.app") */ 4. Den letzten aktuellen Mandanten zuweisen My.cIdx02 = My.cIdx02 */ 5. Los gehts...
Added eine Information, die später ausgegeben werden soll. Siehe auch WriteLogText()
String = My.cLogTextAdd
Methode in der der letzte Fehler auftrat.
Aufbau: [Fehlernummer] [Methode] [Zeilennummer] [Message]
String = My.cMethod
*/ Abruf... WAIT WINDOW My.cMethod
Wert:[String], Umgebungsvariable, wenn eine andere LIC Datei genommen werden soll. GETENV("PMSLICFILE"), wenn leer wird der Standard genommen.
String = My.cPmsOtherLicFile
Rückgabe der PMS Version im Format H.U.DD#SSFF.
Beispiel: 1.0.04#3403
String = My.cPmsVersion
Reset C-Structure
Diese Property ist normalerweise WriteOnly! Sie dient zum Zurücksetzen verschiedener Informationen.
#DEFINE CRI_REMOVE_MENUES "REMOVE-MENUES"
#DEFINE CRI_REMOVE_CSFILES "REMOVE-CS-FILES"
#DEFINE CRI_REMOVE_SCRIPTS "REMOVE-CS-SCRIPTS"
#DEFINE CRI_CHANGE_IDX09 "CHANGE-IDX09"
#DEFINE CRI_LOGIN "USER_LOGIN"
String = My.cResetInfos
*/ Verschiedene RESET Befehle... My.cResetInfos = "REMOVE-MENUES" My.cResetInfos = "REMOVE-CS-FILES" My.cResetInfos = "REMOVE-CS-SCRIPTS" My.cResetInfos = "CHANGE-IDX09" My.cResetInfos = "USER_LOGIN" */ Je nach Klasse wird ein entsprechender RESET ausgeführt!
Gibt eine LOKALE ID in Form von _000000001 => _999999999 zurück. Schneller wie SYS(2015)
String = My.cSys2015
*/ Beispiel: ? My.cSys2015 ? My.cSys2015 ? My.cSys2015 */ Die Rückgabe ist vom Typ: String und hat IMMER 10 Stellen */ Kann genommen werden, wenn für temporäre Cursor eine temporäre ID benötigt wird... CREATE CURSOR temp (_id C(10)) INSERT INTO temp (_id) VALUES (My.cSys2015) INSERT INTO temp (_id) VALUES (My.cSys2015) INSERT INTO temp (_id) VALUES (My.cSys2015) BROWSE
Name des Terminals incl. Umwandlung von Sonderzeichen.
String = My.cTerminal
Angemeldeter Benutzer unter PMS32 bzw. Windows
String = My.cUser
WAIT WINDOW My.cUser
Gibt einen Schlüssel für Terminal-User-IDX02-SYS(2015) zurück. Eindeutiger Schlüssel pro Terminal, Benutzer, Mandant und SYS(2015).
Number = My.fxUsr
*/ Gibt einen Schlüssel für Terminal-User-MANDANT-SYS(2015) zurück. Eindeutiger Schlüssel */ TTTTT-UUUUU-MMMMM-SSSSSSSSS : 27 Stellen...
Gibt den Wert von l_change zurück. Wenn l_change NICHT vorhanden ist, wird .T. zurückgegeben. Verhindert MenüFehler im Skip For.
ACHTUNG: Es gibt auch eine NICHT Funktion! Auf keinen Fall die Funktionen verwechseln!
Boolean = My.lChange
Prüfung auf m.Child. Gibt zurück, ob eine Childtabelle (ALIAS) definiert ist.
Boolean = My.lChild
*/ Nur sinnvoll innerhalb von PMS32 PRIVATE Child AS String Child = .NULL. ? My.lChild Child = "E11" ? My.lChild
Ist .T., wenn GETENV("PMSWRITELOG")="ENV". Auf diese Einstellung wird im gesamten System reagiert! Ist der Wert auf .T. gesetzt, so werden auch in den Namespaces Logs geschrieben.
Boolean = My.lENVlog
Wird durch GETENV("PMS32EditGridColumns")="ON" gesetzt, wenn der Benutzer Datenrasterinformatioen explizit ändern darf.
Boolean = My.lEditGridColumns
Wird gesetzt, wenn ein Namespace Server beendet wird.
Interne Verwendung.
Boolean = My.lEnd
Wert:[Boolean], Gibt den Wert von m.g_EndAll zurück... Wenn .T. wird PMS beendet.
Boolean = My.lEndAll
*/ Beispiel... IF !My.lEndAll */ Hier kann weitergearbeitet werden ENDIF
Wird durch GETENV("PMSWRITELOG")="EPLAN" gesetzt.
Boolean = My.lEplanLog
Diese Klasse wird beendet. Keine Instanziierung im DESTROY der Klasse.
Wenn das Objekt aus dem Speicher gelöscht werden soll, sollen 'KEINE' weiteren Klassen instanziiert werden!
Auf keinen Fall ändern!
Boolean = My.lEraseClass
Mitschreiben eines speziellen LOG's nur beim Aufruf von HDM Masken. PMSWRITELOG="FORM".
Diese Einstellung bezieht sich nur auf Protokolle der HDM Masken.
Boolean = My.lFormStackLog
Rückgabe:[Boolean], Gibt .T. zurück, wenn ein Datenraster aktiv ist.
Diese Property ist nur innerhalb PMS32 sinnvoll.
Boolean = My.lGrid
Ist .T., wenn GETENV("PMSWRITELOG")="GRID". Auf diese Einstellung wird im gesamten System reagiert! Ist der Wert auf .T. gesetzt, so werden auch in den Namespaces Logs geschrieben.
Diese Einstellung wird nur in Grid's verwendet, um dort ein Protokoll mitzuschreiben.
Damit können dediziert nur Grid's protokolliert werden.
Boolean = My.lGridLog
Wert:[Boolean], Gibt an, ob das System ein GUI hat oder nicht. Bei COM+ DLL's ist dieser Wert .F.
Boolean = My.lHasGUI
IF My.lHasGui */ Funktioniert nur dann wenn ein GUI besteht! WAIT WINDOW "Hallo Welt..." ENDIF
Wird gerade ein Dialog ausgeführt. Bedeutet für alle Timer Ihren Prozess zu stoppen...
Boolean = My.lInDialog
Boolean = My.lIsJSOn
Ist die uxtheme.dll installiert?
Diese Property wird eigentlich intern verwendet um zu prüfen, ob Themes verfügbar sind.
Boolean = My.lIsTheme
Wert:[Boolean], Gibt an, ob die VFP2C32 Library gesetzt ist und diese auch Initialisiert wurde
Boolean = My.lIsVfp2C32
Wert:[Boolean], Umgebungsvariable, die bei Lookups des Masters die Relation zum Child neu herstellt. GETENV("PMS32LookupChildRelation")=="OFF".
Diese Property wird intern benötigt!
Boolean = My.lLookupChildRelation
Rückgabe des Masters der Form oder EMPTY wenn m.Master nicht definiert ist.
String = My.lMaster
LOCAL lcMaster lcMaster = My.lMaster IF !EMPTY(m.lcMaster) SELECT (m.lcMaster) */ ... ENDIF
Wird im INIT der Klasse auf .T. gesetzt, wenn VARTYPE(MyReadCheck)=.T. ist. Verhindert jegliche Aktivierung von Klassen!
AUF KEINEN FALL ÄNDERN!
Boolean = My.lMyReadCheck
Wert:[Boolean], Es wurden keine Automatik Parameter an PMS32C.EXE übergeben. Ist dann .F., wenn eine automatische Prozessausführung gewünscht ist.
Boolean = My.lNoAutoLogon
IF !My.lNoAutoLogon */ Dann soll eine automatik Funktion ausgeführt werden. ENDIF
Nicht die DynamicValues der Grid's verwenden! Wird über die ENV Variable NotUseDynamicValues=ON gesetzt
Boolean = My.lNotUseDynamicValues
Wert:[Boolean], Gleichers Verhalten wie unter PMS16? GETENV("PMSCOMPATIPLE")=="PMS32"
Boolean = My.lPmsCompatiple
Wert:[Boolean], Läuft PMS32 auf einem Remote Plattform? Dient zur Steuerung der READ CYCLE Felder. In diesem Fall darf das Feld nicht geändert werden...
Boolean = My.lPmsRemoteServer
Ist ein Hintergrundprozess auf dem Server am Laufen?
Dazu müssen die Dateien im Verzeichnis sys\mysys\
System.Define und eventuell System.Background.Define vorhanden sein.
Weitere Informationen erhalten Sie unter Samples\sample_pms32hx.zip
Boolean = My.lProcessServerRunning
Gibt den Wert von m.l_program zurück, falls vorhanden, wenn nicht wird der Name der momentan aktiven Methode zurückgegeben.
ACHTUNG: Dieser Abruf gibt IMMER einen Programmnamen zurück!
String = My.lProgram
Wert:[Boolean], Umgebungsvariable, die ein Schliessen aller Menüs veranlasst. GETENV("PMS32RELEASEALWAYSMENUS")=="ON"
Diese Funktion wird nur dann benötigt, wenn Menüs geändert und getestet werden.
Boolean = My.lReleaseAlwaysMenus
Die Applikation befindet sich im RunTime Modus... Wird entweder als COM+ Server oder EXE ausgeführt.
Boolean = My.lRunTime
IF NOT My.lRunTime */ Dann könnte hier z.B. ein SUSPEND erfolgen ENDIF
Diese Property wird durch die Umgebungsvariable: GETENV("PMSRUSHMORESTATISTIK")=="ON" gesetzt. Damit werden alle SQL Befehle protokolliert. Sollte nur dann gesetzt werden, falls Laufzeitfehler auftreten!
Boolean = My.lRushMore
Während der Ausführung sind "KEINE" Pfade gesetzt! Nur auf Verlangen muss mit My.Functions.SetPath.SetPath(.T./.F.) der Pfad gesetzt werden...
Sollte wegen Geschwindigkeitseinbusen nicht gesetzt werden! Geben Sie bei der Ausführung von SQL und anderen Befehlen bitte immer den Pfad mit an!
Boolean = My.lSetPath
*/ Schlecht: SELECT b01.* FROM b01 WHERE ... */ Besser: SELECT b01.* FROM (My.Clients.Path.cDbfDir+'b01.dbf') WHERE ... */ Man kann auch über den SQL Handler gehen.... LOCAL lcSql TEXT TO m.lcSql NOSHOW TEXTMERGE PRETEXT 3 SELECT b01.* FROM CDBFDIR!B01 AS b01 WHERE ... ENDTEXT IF My.Clients.Sql.SqlRead(SET("DataSession"),m.lcSql,"qB01") */ Dann haben wir den Cursor aus B01 (qB01) am Wickel... ENDIF
Soll SuspendPMS() die Applikation wirklich anhalten? Standard = .T., wenn .F. wird KEIN Suspend ausgeführt auch wenn _vfp.StartMode=0
Geht nur im Entwicklermode!
Boolean = My.lSuspendPms
Gibt .F. zurück, wenn dieser Wert .F.! Siehe auch THIS._MenuEnabled
Boolean = My.lSysmenuEnabled
Wert:[Boolean], Stoppt bzw. startet wieder alle Timer, die im System laufen..
Boolean = My.lTimerStop
My.lTimerStop = .T. */ Jetzt stehen alle Systemtimer still My.lTimerStop = .F. */ Nicht vergessen, sonst steht PMS32!
GETENV("PMS32StatusBar"), welche Statusbar wird genommen?
Wird die Property auf .T. gesetzt so wird die Original Statusbar von VFP genommen!
Boolean = My.lVfpOriginalStatusBar
Ist .T., wenn GETENV("PMSWRITELOG")="ON". Auf diese Einstellung wird im gesamten System reagiert! Ist der Wert auf .T. gesetzt, so werden auch in den Namespaces Logs geschrieben.
Boolean = My.lWriteLog
*/ Nur kurzzeitig ein Log mitschreiben My.lWriteLog = .T. =MenuHit("E4101") My.lWriteLog = .F.
Es wird auch ein Summenlog mitgeschrieben! PMSWRITELOG=SUM. Die Umgebungsvariable PMSWRITELOG kann verschiedene Inhalte haben!
PMSWRITELOG = "OFF" - Alle Logs abgeschaltet
PMSWRITELOG = "ON" - Nur Standardlog eingeschaltet
PMSWRITELOG = "SUM" - Auch das Summenlog ist eingeschaltet
Boolean = My.lWritelogSUM
Gibt zurück, ob m.Master existiert.
Boolean = My.llMaster
*/ Diese Property wird eigentlich nur intern verwendet... */ Trotzdem ein Beispiel: PRIVATE Master AS STring Master = .NULL. ? My.llMaster Master = "B01" ? My.llMaster
Wird benötigt bei MT-EXE-MU Servern, der Counter wird mit jedem Start hoch- und mit jedem Beenden heruntergezählt. Bei 0 kann My gelöscht werden...
Diese Property wird intern verwendet und sollte vom Benutzer NICHT verändert werden.
Number = My.nCounter
Fehlernummer des letzten Fehlers.
Ist der Wert kleiner null, so handelt es sich um einen logischen Fehler.
Number = My.nError
WAIT WINDOW My.nError
Number = My.nFormSetLog
Zeilennummer, in der der letzte Fehler auftrat
Number = My.nLine
WAIT WINDOW My.nLine
Stackgröße, bei der Ausführung von Programmen. Wichtiger Parameter für die Abfrage von CanSendMessage().
Wird eigentlich nur intern benötigt. Gibt die Programmverschachtelungstiefe beim Programmstart an. Werden PMS interne Funktionen ausgeführt, dann wird das Senden von Messages unterbunden!
Number = My.nStackCount
Gleiche Funktion wie lChange, jedoch wird .F. zurückgegeben wenn l_change nicht vorhanden ist. NOT lChange.
Die Rückgabe ist immer Boolean .T./.F.
Number = My.nlChange
Weitere Methoden:
oCollection.AddCheck(tvItem,tcKey) - Adden eines Eintrags mit verheriger Prüfung (Wenn vorhanden wird NICHT geadded!)
oCollection.Clear() - Löschen des gesamten Collection Inhalts
Object = My.oCollection
*/ Beispiel: LOCAL loColl AS Collection,lReturn AS Boolean loColl = My.oCollection */ Adden mit Prüfung lReturn = loColl.AddCheck(DATE(),"KEY1") && Sollte .T. zurückgeben */ Nochmals lReturn = loColl.AddCheck(DATETIME(),"KEY1") && Sollte .F. zurückgeben loColl.Clear() && Alle Inhalte löschen */ Anmerkung: Ansonsten sind alle Methoden und Properties einer Collection vorhanden!
Kann von TRY ... CATCH ... ENDTRY genutzt werden, um Fehlermeldungen weiter zu geben.
Object = My.oException
*/ Beispiel: LOCAL loException AS Exception TRY i = j && Erzeugt einen Fehler! CATCH TO loException */ Fehlerdetails vervollständigen loException.Details = "Erzwungener Fehler!" */ Und den Fehler speichern (Auch im Errorlog!) My.oException = m.loException ENDTRY
Enthält eine Collection mit KeyCodes für die neue PMS Version
Object = My.oKeys
Gleiches wie My.Bussines.Strain.Misc
Object = My.oMisc
Zwischenspeicher für Bildinformationen.
Object = My.oPictures
Gibt eine XML-Collection zurück.
Wichtige Methoden:
cStructure = GetCursorStructure() && Struktur ohne ()
cXml = ObjectToXml(lStructured)
lDone = StructureToCursor(nDataSession,cAlias)
lDone = XmlToObject(cXmlString)
Object = My.oXml
*/ Die obigen Funktionen werden über: My.Functions.Xml.... aufgerufen
Gibt den Ausdruck für Table.TXUSR [C(10)] zurück.
String = My.txUSR
*/ Beispiel: LOCAL lcTx AS String lcTx = My.txUsr WAIT WINDOW m.lcTx */ Anmerkung: */ Obiger String wird aus den Werten My._Terminal + My._User gebildet! */ Diese beiden Werte werden aus den Teilen von SYS(0) beim Instanziieren von My gebildet */ ._Terminal = UPPER(ALLTRIM(GETWORDNUM(SYS(0),1,"#"))) */ ._User = UPPER(ALLTRIM(GETWORDNUM(SYS(0),2,"#"))) */ Aus beiden Teilen wird eine maximal 5-stellige Checksumme gebildet, die zurückgegeben wird.
Diese Property kann als Zwischenspeicher für globale Variablen genutzt werden.
Dabei wird der Name und der Variableninhalt übergeben.
Intern wird zum Speichern der Informationen eine Collection verwendet!
Die Namen der Variablen werden in UPPER umgewandelt!
"Varname" = My.vVarHolder[tcIndex1 AS String | tiIndex1 AS Integer , tiIndex2 AS Integer] "Varname" = My.vVarHolder[tcIndex1|,tiIndex1,tiIndex2]
*/ Beispiel: LOCAL lvVariable AS Variant lvVariable = CREATEOBJECT("Collection") && Wir nehmen eine Collection... */ Zuweisen der Variablen My.vVarHolder['MeineVariable'] = m.lvVariable */ Existiert obiger Eintrag: 'MeineVariable' so wird der Wert überschrieben! */ Der VarHolder macht KEINEN Unterschied in Groß-/Kleinschreibung! */ MeineVariable = MEINEVARIABLE = meinevariable! */ Abruf der Information lvVariable = My.vVarholder['MeineVariable'] */ Ein spezieller Abruf, hier wird die VarHolder-Collection komplett abgerufen! LOCAL loVarHolder AS Collection */ Abruf der kompletten Collection... loVarHolder = My.vVarHolder[1] */ Gibt es einen Eintrag? (In der Collection wird der Variablenname in UPPER gespeichert!) IF loVarHolder.GETKEY('MEINEVARIABLE')>0 */ Wenn die Variable existiert, dann löschen wir den Eintrag! =loVarHolder.REMOVE('MEINEVARIABLE') ENDIF */ Anmerkung: */ vVarHolder['...'] gibt .NULL. zurück, wenn der Variablenname nicht gefunden wird! */ Beispiel: lvVariable = My.vVarHolder['IstNichtDefiniert'] ? lvVariable && Solle .NULL. sein... */ Anmerkung: */ Wenn man einen Eintrag löschen möchte... My.vVarHolder['MeineVariable'] = .NULL.
Rückgabe des aktuellen Datums
Date = My.xDate
*/ Beispiel: LOCAL ldDate AS Date ldDate = My.xDate WAIT WINDOW m.ldDate
Rückgabe der aktuellen Datum und Uhrzeit.
DateTime = My.xDateTime
*/ Beispiel: LOCAL ltDateTime AS DateTime ltDateTime = My.xDateTime WAIT WINDOW m.ltDateTime
Ermittelt den Kehrwert von m.l_Change. xNoChange = NOT m.l_Change. Ist m.l_change NICHT definiert, so wird .F. zurückgegeben!
Boolean = My.xNoChange
*/ Dieses Beispiel kann nur in PMS32 sinnvoll verwendet werden...
Rückgabe:[String], Gibt den Wert für m.l_program zurück, jedoch NICHT WIE lProgram. Leerstring, falls die Variable NICHT definiert ist!
String = My.xProgram
*/ Dieses Beispiel kann nur in PMS32 sinnvoll verwendet werden... */ Trotzdem ein Beispiel: PRIVATE l_program AS String l_program = .NULL. && Ist damit nicht definiert... ? My.xProgram + '!' && ! l_program = 'TEST.PRG' ? My.xProgram + '!' && TEST.PRG!
Wert:[Variant], Zwischenspeicher für verschiedene Werte.
Dieser Speicher sollte nur intern verwendet werden, wenn diverse Informationen kurzzeitig zwischengespeichert werden müssen.
Verwenden Sie stattdessen: vVarHolder[]...
Variant = My.xTag
Rückgabe der aktuellen Uhrzeit. Gleiche Funktion wäre TIME()
String = My.xTime
*/ Beispiel: LOCAL lcTime AS String lcTime = My.xTime WAIT WINDOW m.lcTime
Rückgabe eines C-Datums in der Schreibweise YYYY-MM-DD
String = My.yDate
*/ Beispiel: LOCAL lcDate AS String lcDate = My.yDate && Das heutige Datum in der Schreibweise YYYY-MM-DD WAIT WINDOW m.lcDate
Siehe auch : Hauptmenü / Hauptindex / Such Index / Cursor Index / Programm Module / Tabellen Index / Tabellenmodule / Masken Index / Programmcode Index / Servicepacks / My.Struktur / Funktionen / Sonstiges Index
Lokale Benutzerhilfe : Meine eigene Hilfe / Zurück zur PMS32 - Hilfe
Dateiversion:1.0.04#3648 - H.U.DD#SSFF 02.12.2022
Senden Sie Ihren Kommentar zu diesem Thema an das Entwicklungsteam von PMS32
Weitere Informationen finden Sie unter der aktuellen
PMS32 WEB-Hilfe
Die Informationen dieser Mitteilung sind vertraulich und nur für Sie bestimmt. Unbefugtes Weiterleiten,
Veröffentlichen, Kopieren usw. sind untersagt und werden gerichtlich verfolgt.
© PMS Compelec GmbH 2022 ® el-Projekt