PMS32 Online- Hilfereferenz
ExcelXml - EXCEL Ausgabe via XML
Ausgabe eines EXCEL Sheets via XML
*/ Inhalt der Datei ExcelXml.Define */ Das Ausgabeverzeichnis der EXCEL - XML Dateien cExcelDir = My.Clients.Path.cDocDir */ Wann soll EXCEL gestertet werden? .NULL. - Nach Vorgabe, .T. - Immer oder .F. - nie */ Siehe auch lStartExcel in den Funktionen: */ ExcelOut...() lStartExcelWhen = .NULL. */ Bitte beachten Sie auch die Einstellung in Excel.Define! lTransferWithXml = .T.
Diese Funktion wird nur dann benötigt, wenn man selbst das Array zur Ausgabe erzeugen bzw. überarbeiten möchte!
Object = My.Functions.ExcelXml.ArrayFromCursors(taArray , tcAliases AS String , tcDbfs AS String, tlChangeField AS Boolean) Object = My.Functions.ExcelXml.ArrayFromCursors(taArray,tcAliases,tcDbfs,tlChangeField)
*/ Die Extended Versions... LOCAL laArray[1] , nCursors AS Integer , cFilename AS String , lBoolean AS Boolean */ Der Dateiname... cFilename = 'c:\tmp\MeinExtendedExcelFile-1.xml' */ Die Daten... */ Die B01 SELECT artnr AS _Artikelnummer_,idb01 AS _idb01,bez,ekbr,eknet,eknet1,t1_ezu,lsgut,ndatum FROM (My.Clients.PATH.cDbfDir+'b01.dbf') ; WHERE artnr="SIE.3TH" ORDER BY artnr INTO CURSOR qB01 NOFILTER READWRITE */ Die D03 SELECT qB01._Artikelnummer_,d03.* FROM qB01 INNER JOIN (My.Clients.PATH.cDbfDir+'d03.dbf') ON qB01._idb01 = d03.idb01 ; ORDER BY qB01._Artikelnummer_,d03.idc61,d03.menge INTO CURSOR qD03 NOFILTER READWRITE */ Die D05 SELECT qB01._Artikelnummer_,d05.* FROM qB01 INNER JOIN (My.Clients.PATH.cDbfDir+'d05.dbf') ON qB01._idb01 = d05.idb01 ; ORDER BY qB01._Artikelnummer_,d05.idc61,d05.idc98 INTO CURSOR qD05 NOFILTER READWRITE */ Erstellen des Arrays nCursors = My.Functions.ExcelXml.ArrayFromCursors(@laArray,'qB01;qD03;qD05','B01;D03;D05']) */ Hier sollte nCursors = 3 sein! FOR n = 1 TO nCursors */ nCursor = 0, wenn kein Array erzeugt werden konnte WITH laArray[n] AS Object .cAlias => [C] - Alias des Cursors .cSheetName => [C] - Name des Excel- Sheets .nColumns => [N] - Anzahl der Spalten im Excel Sheet = Anzahl der Zeilen in .aArray[] .nRows => [N] - Anzahl der Datensätze im Cursor (.cAlias) RECCOUNT()+1 .nRecCount => [N] - Anzahl der Datensätze im Cursor .aArrayCount=> [N] - Anzahl der Zeilen in .aArray[] .aArray => [A] .aArray[n,12] - Array, dass die Spalten - Informationen des entsprechenden Cursors enthält .aArray[n,1] => [C] - Feldname .aArray[n,2] => [C] - Feldtyp, CMVQW;NYFBI;DT;L => Sondertypen: B1-B5 .aArray[n,3] => [N] - Size .aArray[n,4] => [N] - Decimals .aArray[n,5] => [L] - Null erlaubt? .aArray[n,6] => [L] - NOCPTRANS .aArray[n,7] => [C] - Alias.Feldname .aArray[n,8] => [C] - Dbf.Feldname, falls eine Liste mit Tabellen angegeben wurde .aArray[n,9] => [C] - Excel-Style: vfp<Feldtyp>m|o : m-Hintergrund-Gelb | o-Hintergrund-weis : IIF(.aArray[5],'m','o') .aArray[n,10] => [C] - Expression zum erzeugen des Feldinhalts .aArray[n,11] => [C] - Caption, Spaltenüberschrift .aArray[n,12] => [C] - Excel-Feldtyp: Number;String;DateTime;Boolean ENDWITH NEXT n */ Der weitere Aufbau des Arrays ist oben beschrieben (Beide Methoden tun das Gleiche!) lBoolean = My.Functions.ExcelXml.ExcelOutCursorExt(cFilename,@laArray[,lStartExcel]) lBoolean = My.Functions.ExcelXml.ExcelOutCursorsExt(cFilename,@laArray[,lStartExcel])
Interne Funktion
Integer = My.Functions.ExcelXml.ArrayFromGrid(taArray , toGrid AS GRID) Integer = My.Functions.ExcelXml.ArrayFromGrid(taArray,toGrid)
Ausgabe eines VFP-Cursors via EXCEL - XML
Variant = My.Functions.ExcelXml.ExcelOutCursor(tcExcelFile AS STRING,tcAlias AS STRING,tcDbf AS STRING,tlStartExcel AS Boolean,tlChangeField AS Boolean) Variant = My.Functions.ExcelXml.ExcelOutCursor(tcExcelFile,tcAlias,tcDbf,tlStartExcel,tlChangeField)
*/ Beispiel: (My) ist bekannt! LOCAL llDone AS Boolean , lcFile AS String lcFile = "c:\tmp\MeineExcelDatei-1.xml" */ Erzeugen eines Cursors... SELECT artnr,idb01,bez,ekbr,eknet,eknet1,t1_ezu,lsgut,ndatum ; FROM (My.Clients.PATH.cDbfDir+'b01.dbf') WHERE artnr="SIE.3TH" ; ORDER BY artnr ; INTO CURSOR qB01 NOFILTER READWRITE llDone = My.Functions.ExcelXml.ExcelOutCursor(m.lcFile,"QB01","B01")
Ausgabe eines VFP-Cursors via EXCEL - XML unter Angabe des Arrays
n,12 = My.Functions.ExcelXml.ExcelOutCursorExt(tcExcelFile AS STRING,taArray,tlStartExcel AS Boolean) n,12 = My.Functions.ExcelXml.ExcelOutCursorExt(tcExcelFile,taArray,tlStartExcel)
*/ Beispiel: (My) ist bekannt LOCAL llDone AS Boolean , lcFile AS String , laArray[1] , lnLen AS Number lcFile = "c:\tmp\MeineExcelDatei-2.xml" */ Erzeugen eines Cursors... SELECT artnr,idb01,bez,ekbr,eknet,eknet1,t1_ezu,lsgut,ndatum ; FROM (My.Clients.PATH.cDbfDir+'b01.dbf') WHERE artnr="SIE.3TH" ; ORDER BY artnr ; INTO CURSOR qB01 NOFILTER READWRITE lnLen = My.Functions.ExcelXml.ArrayFromCursors(@laArray,'qB01','B01') IF m.lnLen>0 */ Das obige Array könnte man hier noch nacharbeiten... llDone = My.Functions.ExcelXml.ExcelOutCursorExt(m.lcFile,@laArray,.T.) ENDIF
Variant = My.Functions.ExcelXml.ExcelOutCursorPD(tnDataSession AS NUMBER,tcExcelFile AS STRING,tcAlias AS STRING,tcDbf AS STRING,tlStartExcel AS Boolean,tlChangeField AS Boolean) Variant = My.Functions.ExcelXml.ExcelOutCursorPD(tnDataSession,tcExcelFile,tcAlias,tcDbf,tlStartExcel,tlChangeField)
Ausgabe mehrerer VFP-Cursor via EXCEL - XML
Boolean = My.Functions.ExcelXml.ExcelOutCursors(tcExcelFile AS STRING,tcAliases AS STRING,tcDbfs AS STRING,tlStartExcel AS Boolean,tlChangeField AS Boolean) Boolean = My.Functions.ExcelXml.ExcelOutCursors(tcExcelFile,tcAliases,tcDbfs,tlStartExcel,tlChangeField)
*/ Beispiel: (My) ist bekannt! LOCAL llDone AS Boolean , lcFile AS String lcFile = "c:\tmp\MeineExcelDatei-More-1.xml" */ Die B01 SELECT artnr AS _Artikelnummer_,idb01 AS _idb01,bez,ekbr,eknet,eknet1,t1_ezu,lsgut,ndatum FROM (My.Clients.PATH.cDbfDir+'b01.dbf') ; WHERE artnr="SIE.3TH" ORDER BY artnr INTO CURSOR qB01 NOFILTER READWRITE */ Die D03 SELECT qB01._Artikelnummer_,d03.* FROM qB01 INNER JOIN (My.Clients.PATH.cDbfDir+'d03.dbf') ON qB01._idb01 = d03.idb01 ; ORDER BY qB01._Artikelnummer_,d03.idc61,d03.menge INTO CURSOR qD03 NOFILTER READWRITE */ Die D05 SELECT qB01._Artikelnummer_,d05.* FROM qB01 INNER JOIN (My.Clients.PATH.cDbfDir+'d05.dbf') ON qB01._idb01 = d05.idb01 ; ORDER BY qB01._Artikelnummer_,d05.idc61,d05.idc98 INTO CURSOR qD05 NOFILTER READWRITE llDone = My.Functions.ExcelXml.ExcelOutCursors(m.lcFile,"QB01;QD03;QD05","B01;D03;D05")
Ausgabe mehrerer VFP-Cursor via EXCEL - XML unter Angabe des Arrays
Boolean = My.Functions.ExcelXml.ExcelOutCursorsExt(tcExcelFile AS STRING,taArray,tlStartExcel AS Boolean) Boolean = My.Functions.ExcelXml.ExcelOutCursorsExt(tcExcelFile,taArray,tlStartExcel)
*/ Beispiel: (My) ist bekannt LOCAL llDone AS Boolean , lcFile AS String , laArray[1] , lnLen AS Number lcFile = "c:\tmp\MeineExcelDatei-More-2.xml" */ Die B01 SELECT artnr AS _Artikelnummer_,idb01 AS _idb01,bez,ekbr,eknet,eknet1,t1_ezu,lsgut,ndatum FROM (My.Clients.PATH.cDbfDir+'b01.dbf') ; WHERE artnr="SIE.3TH" ORDER BY artnr INTO CURSOR qB01 NOFILTER READWRITE */ Die D03 SELECT qB01._Artikelnummer_,d03.* FROM qB01 INNER JOIN (My.Clients.PATH.cDbfDir+'d03.dbf') ON qB01._idb01 = d03.idb01 ; ORDER BY qB01._Artikelnummer_,d03.idc61,d03.menge INTO CURSOR qD03 NOFILTER READWRITE */ Die D05 SELECT qB01._Artikelnummer_,d05.* FROM qB01 INNER JOIN (My.Clients.PATH.cDbfDir+'d05.dbf') ON qB01._idb01 = d05.idb01 ; ORDER BY qB01._Artikelnummer_,d05.idc61,d05.idc98 INTO CURSOR qD05 NOFILTER READWRITE lnLen = My.Functions.ExcelXml.ArrayFromCursors(@laArray,'qB01;qD03;qD05','B01;D03;D05') IF m.lnLen>0 */ Das obige Array könnte man hier noch nacharbeiten... llDone = My.Functions.ExcelXml.ExcelOutCursorsExt(m.lcFile,@laArray,.T.) ENDIF
Variant = My.Functions.ExcelXml.ExcelOutCursorsPD(tnDataSession AS NUMBER,tcExcelFile AS STRING,tcAliases AS STRING,tcDbfs AS STRING,tlStartExcel AS Boolean,tlChangeField AS Boolean) Variant = My.Functions.ExcelXml.ExcelOutCursorsPD(tnDataSession,tcExcelFile,tcAliases,tcDbfs,tlStartExcel,tlChangeField)
Ausgabe eines Datenrasters (interne Methode)
Variant = My.Functions.ExcelXml.ExcelOutGrid(tnWhat AS NUMBER,toGrid AS GRID,tlStartExcel AS Boolean) Variant = My.Functions.ExcelXml.ExcelOutGrid(tnWhat,toGrid,tlStartExcel)
*/ Wird eigentlich intern benötigt aber... */ Auch hier sollte My bekannt sein... LOCAL llDone AS Boolean */ Ein freies Grid definieren PUBLIC oGrid AS Grid */ Die Tabelle B01 öffnen und auf alle SIE.3TH filtern.. USE (My.Clients.Path.cDbfDir+'B01.DBF') SHARED SET FILTER TO artnr="SIE.3TH" */ Ein BROWSE in die Variable oGrid (oGrid ist in dann ein Datenraster 'ähnlich' einem Grid in PMS32) BROWSE FIELDS artnr,bez,ekbr,eknet,eknet1,t1_ezu,ndatum NAME oGrid NOWAIT llDone = My.Functions.ExcelXml.ExcelOutGrid(1,m.oGrid)
Variant = My.Functions.ExcelXml.ExcelOutGridNew(tnDataSession AS Interger,tnWhat AS NUMBER,toGrid AS GRID,tlStartExcel AS Boolean) Variant = My.Functions.ExcelXml.ExcelOutGridNew(tnDataSession,tnWhat,toGrid,tlStartExcel)
Boolean = My.Functions.ExcelXml.ExcelOutGridPD(tnDataSession AS Interger,tnWhat AS NUMBER,toGrid AS GRID,tlStartExcel AS Boolean) Boolean = My.Functions.ExcelXml.ExcelOutGridPD(tnDataSession,tnWhat,toGrid,tlStartExcel)
Umwandeln eines beliebigen Values in einen String
Hinweis zu den Feldtypen, die in VFP in einer Tabelle/Cursor vorhanden sein können
[C|V] => Char / Varchar. Strings werden immer rechtsbündig getrimmt
[M] => Memo / Langtext. Wird nicht getrimmt
[Q|W] => VarBinary/Blob. Sonderfelder (Zeichen)
[NYFBI] => Numerische Felder (+/-): Maximale Länge eines num. Feldes incl. Nachkommastellen: 16 Digits
[N] => N(s,1). Num. Feld mit EINER Nachkommastelle (Prozentwerte)
[Y] => Currency. Num. mit zwei Nachkommastellen
[F] => F(s,3). Num. Feld mit drei Nachkommastellen (Mengen)
[B] => B-Double. Num. Feld mit mehr als fünf oder Null Nachkommastellen
*/ Sonderfelder:
[B1]-[B5] => B-Double. Num. Feld mit 1-5 Nachkommastellen
[I] => Integer. Ganzzahl ohne Nachkommastellen
[DT] => Date und DateTime. Bitte ein T-Feld in der PMS Datenbank in DATE und DATETIME auftrennen!
Beispiel: I41.DT1 [T]:
CAST(TTOD(I41.DT1) AS D) AS D1_Datum , I41.DT1 AS D1_Zeit
Bei DateTime wird NUR der ZEITWERT hh:mm:ss.000 dargestellt!
Das Datum wird immer mit: 1899-12-31T angegeben
[L] => Logisch/Boolean. .T.=1 / .F.=0
String = My.Functions.ExcelXml.TransformValue(tvValue AS Variant, tcType AS String , tlNoBrackets AS Boolean) String = My.Functions.ExcelXml.TransformValue(tvValue,tcType,tlNoBrackets)
Beispiel: (Die Methode wird eigentlich intern benötigt!) ? My.Functions.ExcelXml.TransformValue(123.45,'Y') */ Displays: 123.45 ? My.Functions.ExcelXml.TransformValue(123.45,'N') */ Displays: 123.5 ? My.Functions.ExcelXml.TransformValue(123.45,'B4') */ Displays: 123.4500
Interne Methode / Property
taArray = My.Functions.ExcelXml._DataHeadLine(taArray) taArray = My.Functions.ExcelXml._DataHeadLine(taArray)
Interne Methode / Property
taArray = My.Functions.ExcelXml._DataLine(taArray) taArray = My.Functions.ExcelXml._DataLine(taArray)
Interne Methode / Property
Variant = My.Functions.ExcelXml._ExcelWrite(tcXml AS STRING , tcExcelFile AS STRING , tlStartExcel AS Boolean) Variant = My.Functions.ExcelXml._ExcelWrite(tcXml,tcExcelFile,tlStartExcel)
Interne Methode / Property
Variant = My.Functions.ExcelXml._WorKSheetFooter()
Interne Methode / Property
Variant = My.Functions.ExcelXml._WorKSheetHeader(tcName AS String , tnColumns AS Integer , tnRows AS Integer) Variant = My.Functions.ExcelXml._WorKSheetHeader(tcName,tnColumns,tnRows)
String = My.Functions.ExcelXml._ArrayInfo
Interne Methode / Property
String = My.Functions.ExcelXml._ExcelSheetFooter
Interne Methode / Property
String = My.Functions.ExcelXml._ExcelSheetHeader
Interne Methode / Property
String = My.Functions.ExcelXml._ExcelStyles
Interne Methode / Property
String = My.Functions.ExcelXml._ExcelWorkbookHeader
Ausgabeverzeichnis der XML - EXCEL Dateien.
Die Vorgabe kann in ExcelXml.Define eingestellt werden.
String = My.Functions.ExcelXml.cExcelDir
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.Functions.ExcelXml.cIdx02
*/ Abfrage der Mandanten-ID WAIT WINDOW My.Functions.ExcelXml.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...
Mit dieser Property kann der letzte Fehler im Klartext abgerufen werden.
String = My.Functions.ExcelXml.cLastError
*/ Vorausgesetzt wird, dass My bekannt ist... LOCAL lcError AS String lcError = My.Functions.ExcelXml.cLastError
Enthätl Pfad und Namen der zuletzt erstellten XML-Excel Datei
String = My.Functions.ExcelXml.cLastExcelFile
Wann soll EXCEL gestertet werden? .NULL. - Nach Vorgabe, .T. - Immer oder .F. - nie
Boolean = My.Functions.ExcelXml.lStartExcelWhen
*/ Siehe dazu auch die Datei ExcelXml.Define
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