// --------------------------------------------------- // Initialisierung lokaler Funktionen // --------------------------------------------------- /* Übersicht: Datacollector_JMPFood = Function() */ // Datenkollektor für Kuchendaten Datacollector_JMPFood = Function( {}, {Default Local}, /* */ // Begin Counter start = Today(); // Initialise Log-Informations ImportedFiles = 0; ImportedMeasurements = 0; MeasurementAlreadyImported = 0; WrongFileContent = 0; // Open Imported Data-Status DT_AvailableMeasurements = Open Database( "DSN=MS Access Database;DBQ=" || OrdnerFuerRohdatenDB || "JMP_Food.mdb; DefaultDir=" || OrdnerFuerRohdatenDB || ";DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;UID=admin;", "SELECT Meeting FROM Daten ORDER BY Meeting DESC", "DT_AvailableMeasurements", invisible ); // Set timestamp column to character AvailableMeasurements = Column( DT_AvailableMeasurements, "Meeting" ) << Get Values; Close( DT_AvailableMeasurements, nosave ); // Connect to Database dbc = Create Database Connection( "DSN=MS Access Database;DBQ=" || OrdnerFuerRohdatenDB || "JMP_Food.mdb; DefaultDir=" || OrdnerFuerRohdatenDB || ";DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;UID=admin;", ); // Import data Try( DT_CurrentData = Open( "" || OrdnerFuerRohdaten || "JMP_Food.txt", columns( Column( "Meeting", Character ), Column( "Breakfast", Numeric, Continuous, Format( "Best", 10 ) ), Column( "Lunch", Numeric, Continuous, Format( "Best", 10 ) ), Column( "Dinner", Numeric, Continuous, Format( "Best", 10 ) ), Column( "Snacks", Numeric, Continuous, Format( "Best", 10 ) ), ), Import Settings( End Of Line( CRLF, CR, LF ), End Of Field( Tab, Space, CSV( 0 ) ), Strip Quotes( 1 ), Use Apostrophe as Quotation Mark( 0 ), Scan Whole File( 1 ), Treat empty columns as numeric( 0 ), CompressNumericColumns( 0 ), CompressCharacterColumns( 0 ), CompressAllowListCheck( 0 ), Labels( 1 ), Column Names Start( 1 ), Data Starts( 2 ), Lines To Read( "All" ), Year Rule( "20xx" ) ) ); // Convert numeric-character-columns to numeric-columns by changing the decimal-delimiter from "," to "." For( columnnumber = 1, columnnumber <= N Col( DT_CurrentData ), columnnumber++, For Each Row( Try( Column( DT_CurrentData, columnnumber ) << Data Type(character)); //Try( :As Column( DT_CurrentData, columnnumber ) = Substitute( :As Column( DT_CurrentData, columnnumber ), ".", "," ); ) ); // Get column names of current datatable ColumnNames = DT_CurrentData << get column names( string ); // Import rows of current datatable For( dataRows = 1, dataRows <= N Rows( DT_CurrentData ), dataRows++, If( Contains( AvailableMeasurements, Column( DT_CurrentData, "Meeting" )[dataRows] ) > 0 , MeasurementAlreadyImported++; Continue(); ); // Build SQL INSERT INTO string SQLImportString = "INSERT INTO Daten ( "; For( k = 1, k <= N Items( ColumnNames ), k++, If( k != N Items( ColumnNames ), SQLImportString = SQLImportString || ColumnNames[k] || " , ", SQLImportString = SQLImportString || ColumnNames[k] || ") " ) ); SQLImportString = SQLImportString || "VALUES ( "; For( k = 1, k <= N Items( ColumnNames ), k++, If( k != N Items( ColumnNames ), SQLImportString = SQLImportString || "'" || Char( Column( DT_CurrentData, ColumnNames[k] )[dataRows] ) || "' , ", SQLImportString = SQLImportString || "'" || Char( Column( DT_CurrentData, ColumnNames[k] )[dataRows] ) || "' );" ) ); SQLImportString = substitute(SQLImportString,"''","Null"); Execute SQL( dbc, SQLImportString ); ImportedMeasurements++; ); Close( DT_CurrentData, nosave ); ImportedFiles++; , Try( Close( DT_CurrentData, nosave ) ); WrongFileContent++; ); Close Database Connection( dbc ); // Finale write of Log-File stop = Today(); dauer = (stop - start) / 60; show( dauer ); ); // Hinzufügen des "Prefix" zu allen Spalten der Tabelle "DT_aktuell", außer bei Spalte "serialnumber" AddColumnPrefix = Function( {DT_aktuell, Prefix}, {Default Local}, /* DT_aktuell = DT_PK_statistics; Prefix = columnprefix; */ ColumnNames = DT_aktuell << get column names( string ); For( i = 1, i <= N Items( ColumnNames ), i++, ColumnName = ColumnNames[i]; If( ColumnName == "Meeting", ColumnNameNew = ColumnNames[i], ColumnNameNew = Prefix || "_" || ColumnNames[i] ); Column( DT_aktuell, ColumnName ) << Set Name( ColumnNameNew ); ); ); // Hinzufügen des "Suffix" zu allen Spalten der Tabelle "DT_aktuell", außer bei Spalte "serialnumber" AddColumnSuffix = Function( {DT_aktuell, Suffix}, {Default Local}, /* DT_aktuell = DT_PK_statistics; Suffix = columnprefix; */ ColumnNames = DT_aktuell << get column names( string ); For( i = 1, i <= N Items( ColumnNames ), i++, ColumnName = ColumnNames[i]; If( ColumnName == "serialnumber", ColumnNameNew = ColumnNames[i], ColumnNameNew = ColumnNames[i] || "_" || Suffix ); Column( DT_aktuell, ColumnName ) << Set Name( ColumnNameNew ); ); ); // Alle Spaltenformeln einer Tabelle löschen DeleteColumnFormulas = Function( {dt}, {Default Local}, /* fromList = SelectedLotnames; separator = "|"; */ columnnames = dt << Get column names( string ); For( i = 1, i <= N Items( columnnames ), i++, Try( Column( dt, columnnames[i] ) << Delete Formula ) ); Return( dt ); ); // Erstelle Character-String aus einer Liste List2Char = Function( {fromList, separator}, {Default Local}, /* fromList = SelectedLotnames; separator = "|"; */ string = ""; For( i = 1, i <= N Items( fromList ), i++, If( i == 1, sep = "", sep = " " || separator || " " ); If( Is Number( fromList[i] ), element = Char( fromList[i] ), element = fromList[i] ); If( Modulo( i, 4 ) == 0, cr = "\!n", cr = "" ); string = string || sep || cr || element; ); Return( string ); ); // Deaktiviere die Spalteneigenschaft "ListCheck" für alle Spalten der Tabelle "DT" DeactListCheck = Function( {DT}, {Default Local}, /* DT = DT_gesamt; */ spaltennamen = DT << get column names( string ); For( i = 1, i <= N Items( spaltennamen ), i++, Try( Column( DT, spaltennamen[i] ) << List Check() ) ); Return( DT ); ); // Komprimieren aller Tabellenspalten CompressColums = Function( {DT_aktuell}, {Default Local}, Spaltennamen = DT_aktuell << Get column names(); For( i = 1, i <= N Items( Spaltennamen ), i++, Column( DT_aktuell, Spaltennamen[i] ) << Set Selected( 1 ) ); DT_aktuell << Compress Selected Columns(); DT_aktuell << Clear Column Selection; ); // Filtern des jeweils aktuellsten Eintrag's der Tabelle "DT_aktuell" bzgl. der Spalte "DistinctColumn" GetDistinctValueTable = Function( {DT_aktuell, DistinctColumn}, {Default Local}, TableName = DT_aktuell << Get name || "_Distinct" || DistinctColumn; DT_aktuell << Join( With( DT_aktuell ), By Matching Columns( :Column( DT_aktuell, DistinctColumn ) = :Column( DT_aktuell, DistinctColumn ) ), Drop multiples( 1, 1 ), Name( "Include non-matches" )(0, 0), Preserve main table order( 1 ), Output Table( TableName ) ); ); SortTableBy = Function( {DT_aktuell, SortColumn1, SortOrder1,SortColumn2, SortOrder2}, {Default Local}, /* DT_aktuell = DT_gesamt; SortColumn1 = "serialnumber"; SortOrder1 = "Ascending"; SortColumn2 = "serialnumber"; SortOrder2 = "Ascending"; */ DT_aktuell << Sort( By( :column( SortColumn1 ),:column( SortColumn2 ) ), Order( SortOrder1,SortOrder2 ), Replace Table ); ); TableFromList = Function( {ColumnList, TableName}, {Default Local}, /* ColumnList = Spalten; TableName = DataTable_prefix || LT_name || LT_namesuffix; */ // Erstellen des Strings für die Tabelle string = "dt = New Table( \!"" || TableName || " \!","; For( i = 1, i <= N Items( ColumnList ), i++, string = string || "New Column( \!"" || ColumnList[i][1] || "\!" , " || ColumnList[i][2] || " , " || ColumnList[i][3] || ")," ); string = string || ", invisible);"; // Tabelle gemäß Strings erstellen Eval( Parse( string ) ); Return( dt ); ); // Erstellen eines Subset's "SubSetName" aus Tabelle "fromDT" bezüglich der Spalten "ParameterColumn" hemäß der Spaltenreihenfole "SortColumn" // Syntax: SubsetFromList( Sourcetable, SubsetContentTable, SubsetName, SortColumn ) SubsetFromList = Function( {fromDT, SubsetContentTable, SubsetName, ParameterColumn, SortColumn}, {Default Local}, /* fromDT = SubsetSourceTableName; SubsetContentTable = DT_CurrentSubsetLayout; SubsetName = Words(CurrentSubsetName,".")[1]; ParameterColumn = "ColumnName"; SortColumn = "AbsolutePosition"; */ SubsetContentTable << sort( By( Column( SubsetContentTable, SortColumn ) ), Order( Ascending ), Replace Table ); SubsetContent = Column( SubsetContentTable, ParameterColumn ) << Data type( "character" ) << Get values(); SubsetOrder = Column( SubsetContentTable, SortColumn ) << Get values(); fromDTContent = Data Table( fromDT ) << Get Column Names( string ); SubsetContent_temp = SubsetContent; // i = 49; For( i = 1, i <= N Items( SubsetContent ), i++, If( Contains( fromDTContent, SubsetContent[i] ) == 0, Remove From( SubsetContent_temp, Contains( SubsetContent_temp, SubsetContent[i] ), 1 ) ) ); SubsetContent = SubsetContent_temp; Subset = {{}, {}}; Subset[1] = Insert( Subset[1], SubsetContent ); Subset[2] = Insert( Subset[2], SubsetOrder ); // Erstellen des Strings für das Subset SubsetString = SubsetName || " = Data Table(\!"" || fromDT || "\!") << Subset( All rows, columns("; For( i = 1, i <= N Items( Subset[1] ), i++, If( i == N Items( Subset[1] ), SubsetString = SubsetString || ":Name(\!"" || Subset[1][i] || "\!")", SubsetString = SubsetString || ":Name(\!"" || Subset[1][i] || "\!")," ) ); SubsetString = SubsetString || "), invisible);"; // Subset gemäß Subsetsring erstellen Eval( Parse( SubsetString ) ); DT_subset = Parse( SubsetName ); // Spaltenanordnung festlegen For( i = 1, i <= N Items( Subset[1] ), i++, Column( DT_subset, Subset[1][i] ) << Set Selected( 1 ); DT_subset << Move Selected Columns( to last ); DT_subset << Clear Column Selection; ); Return( DT_subset ); ); // Hinzufügen der Tabelle 'fromDT' zur Tabelle 'toDT' via Vergleich der Spalte "MatchColumn" // wobei die Tabelle bzgl. Seriennummer und Zeitstempel ABSTEIGEND sortiert sein muss um den neuesten Werten hinzuzufügen. AddTable2DT = Function( {toDT, MatchColumn, fromDT}, {Default Local}, /* toDT = DT_gesamt; MatchColumn = "serialnumber"; fromDT = DT_M_BE_ISO_DistinctSerialnumber; */ // Initialisierung fromDT_Tabellenname = (fromDT << Get Name); fromDT_Spaltennamen = fromDT << Get Column Names( string ); // Festlegung des Tabellenprefix für den finalen Tabellennamen der Zieltabelle If( Contains( (toDT << get name), "DT_gesamt" ), tablenamePrefix = "DT_gesamt", tablenamePrefix = (toDT << get name) ); // --------------------- // Hinzufügen der Spalten zur Tabelle "toDT" via Vergleich der Spalte "MatchColumn", // Gruppieren und Sammeln der Gruppeneigenschaften, wenn "fromDT" Werte enthält. // --------------------- If( !Is Empty( fromDT ), toDT_temp = toDT; toDT = toDT << Join( With( fromDT ), Merge Same Name Columns, // Update first table with data from second table, By Matching Columns( Column( MatchColumn ) = Column( MatchColumn ) ), Drop multiples( 0, 0 ), Name( "Include non-matches" )(1, 1), Preserve main table order( 1 ), Output Table( tablenamePrefix || "_LastTableAdded_" || fromDT_Tabellenname ), invisible ); Close( toDT_temp, nosave ); toDT << Delete Column( "Match Flag" ); // Hinzufügen der Spalteninformationen zur Liste "GroupProperties" AddGroupPropertiesAndGroup2DT( toDT, fromDT ); ); Return( toDT ); ); // Update der Tabelle "toDT" mit Daten der Tabelle "fromnDT" via Vergleich der Spalten "MatchColumn", // wobei die Tabelle bzgl. Seriennummer und Zeitstempel AUFSTEIGEND sortiert sein muss um den neuesten Werten hinzuzufügen. // Nichtvorhandene Spalten in Tabelle "toDT" werden ergänzt und gruppiert. AddColumns2DTByMatchOneCol = Function( {fromDT, toDT, MatchColumn}, {Default Local}, /* fromDT = DT_PK_statistics; toDT = DT_gesamt; MatchColumn = "serialnumber"; */ // Initialisierung fromDT_Tabellenname = (fromDT << Get Name); // Festlegung des Tabellenprefix für den finalen Tabellennamen der Zieltabelle If( Contains( (toDT << get name), "DT_gesamt" ), tablenamePrefix = "DT_gesamt", tablenamePrefix = (toDT << get name) ); // --------------------- // Hinzufügen der Spalten zur Tabelle "toDT" via Vergleich der Spalte "MatchColumn", // Gruppieren und Sammeln der Gruppeneigenschaften, wenn "fromDT" Werte enthält. // --------------------- toDT << Update( With( fromDT ), Match Columns( Column( MatchColumn ) = Column( MatchColumn ) ) ); toDT << set name( tablenamePrefix || "_LastTableAdded_" || fromDT_Tabellenname ); Return( toDT ); ); // Update der Tabelle "toDT" mit Daten der Tabelle "fromnDT" via Vergleich der Spalten "MatchColumn1" und "MatchColumn2" // wobei die Tabelle bzgl. Seriennummer und Zeitstempel AUFSTEIGEND sortiert sein muss um den neuesten Werten hinzuzufügen. // Nichtvorhandene Spalten in Tabelle "toDT" werden ergänzt und gruppiert. AddColumns2DTByMatchTwoCol = Function( {fromDT, toDT, MatchColumn1, MatchColumn2}, {Default Local}, /* fromDT = DT_WP_subset; toDT = DT_gesamt; MatchColumn1 = "DIF_ofennummer"; MatchColumn2 = "DIF_runnummer"; */ // Initialisierung fromDT_Tabellenname = (fromDT << Get Name); // Festlegung des Tabellenprefix für den finalen Tabellennamen der Zieltabelle If( Contains( (toDT << get name), "DT_gesamt" ), tablenamePrefix = "DT_gesamt", tablenamePrefix = (toDT << get name) ); // --------------------- // Hinzufügen der Spalten zur Tabelle "toDT" via Vergleich der Spalte "MatchColumn", // Gruppieren und Sammeln der Gruppeneigenschaften, wenn "fromDT" Werte enthält. // --------------------- toDT << Update( With( fromDT ), Match Columns( Column( MatchColumn1 ) = Column( MatchColumn1 ), Column( MatchColumn2 ) = Column( MatchColumn2 ) ) ); toDT << set name( tablenamePrefix || "_LastTableAdded_" || fromDT_Tabellenname ); Return( toDT ); ); // Spaltenweises Update der Tabelle "toDT" mit Daten der Tabelle "fromDT" via Vergleich der Spalten "MatchColumn", // wobei die Tabelle bzgl. Seriennummer und Zeitstempel AUFSTEIGEND sortiert sein muss um den neuesten Werten hinzuzufügen. UpdateColumnsInDTByMatchOneCol = Function( {fromDT, toDT, MatchColumn}, {Default Local}, /* fromDT = DT_Info_bzgl_ID; toDT = DT_gesamt; MatchColumn = "serialnumber"; */ // Initialisierung fromDT_Tabellenname = (fromDT << Get Name); fromDT_Spaltennamen = fromDT << get column names( string ); // Festlegung des Tabellenprefix für den finalen Tabellennamen der Zieltabelle If( Contains( (toDT << get name), "DT_gesamt" ), tablenamePrefix = "DT_gesamt", tablenamePrefix = (toDT << get name) ); // --------------------- // Update der Spalten 'fromDT_Spaltennamen' in Tabelle "toDT" via Vergleich der Spalte "MatchColumn", // --------------------- For( i = 1, i <= N Items( fromDT_Spaltennamen ), i++, If( fromDT_Spaltennamen[i] != MatchColumn, spaltenname = fromDT_Spaltennamen[i]; fromDT << Clear Row States; fromDT << select where( !Is Missing( As Column( fromDT, spaltenname ) ) ); Try( Column( toDT, spaltenname ) << List Check() ); If( N Rows( fromDT << get selected rows ) > 0, fromDT_subset = fromDT << Subset( selected rows( 1 ), columns( Column( MatchColumn ), Column( spaltenname ) ) ); toDT << Update( With( fromDT_subset ), Match Columns( Column( MatchColumn ) = Column( MatchColumn ) ) ); toDT << set name( tablenamePrefix || "_LastColumnUpdated_" || spaltenname ); Close( fromDT_subset, nosave() ); ); ) ); Return( toDT ); ); // Update einzelner Spalten der Tabelle "toDT" mit Daten der Tabelle "fromDT" via Vergleich der Spalten "MatchColumn" // wobei die Tabelle bzgl. Seriennummer und Zeitstempel AUFSTEIGEND sortiert sein muss um den neuesten Werten hinzuzufügen. // und die Spalte(n) in der Liste "Columnlist" stehen UpdateSingleColumnInDTByMatchOneCol = Function( {fromDT, toDT, MatchColumn, Sortinglist, Columnlist}, {Default Local}, /* fromDT = DT_A_O2_DAILYSCHEDULE_gesamt; toDT = DT_gesamt; MatchColumn = "serialnumber"; Columnlist = SelectUpdateColumns; */ // Initialisierung fromDT_Tabellenname = (fromDT << Get Name); // Festlegung des Tabellenprefix für den finalen Tabellennamen der Zieltabelle If( Contains( (toDT << get name), "DT_gesamt" ), tablenamePrefix = "DT_gesamt", tablenamePrefix = (toDT << get name) ); // --------------------- // Update der Spalten 'fromDT_Spaltennamen' in Tabelle "toDT" via Vergleich der Spalte "MatchColumn", // --------------------- For( i = 1, i <= N Items( Columnlist ), i++, If( Columnlist[i] != MatchColumn, spaltenname = Columnlist[i]; fromDT << Clear Row States; fromDT << select where( !Is Missing( As Column( fromDT, spaltenname ) ) ); Try( Column( toDT, spaltenname ) << List Check() ); If( N Rows( fromDT << get selected rows ) > 0, fromDT_subset = fromDT << Subset( selected rows( 1 ), columns( Column( MatchColumn ), Column( spaltenname ) ) ); toDT << Update( With( fromDT_subset ), Match Columns( Column( MatchColumn ) = Column( MatchColumn ) ) ); toDT << set name( tablenamePrefix || "_LastColumnUpdated_" || spaltenname ); Close( fromDT_subset, nosave() ); ); ) ); Return( toDT ); ); // Hinzufügen der Spalten, welche in der Liste "Spalten", zu Tabelle "toDT". // Die Spalten werden ohne Inhalt angelegt. AddColumns = Function( {toDT, Spalten}, {Default Local}, /* toDT = DT_gesamt; Spalten = Spaltenliste; */ For( i = 1, i <= N Items( Spalten ), i++, NewColumn = "toDT << New Column( \!"" || Spalten[i][1] || "\!" , " || Spalten[i][2] || " , " || Spalten[i][3] || ")"; Eval( Parse( NewColumn ) ); ) ); GraphBuilder_SelectActionAfterMakeGraphs = Function( {Modus}, /* dataFilter = Modus */ If( Modus == 1, gb << Save Picture( Ordn || Dateiname, PNG ); gb << Close Window(); Modus == 2, gb << Set Window Title( TXT_Kategorie || "_" || TXT_Merkmale ) << Maximize window(1); gb << Auto Stretching( 1 ), ); ); GetItemsFromListWhere = Function( {InputList, searchString, delimiter}, {Default Local}, /* InputList = MetaDataAll[1]; searchString = {"MC","DIF"}; delimiter = "_"; */ OutputList = {}; for(i=1, i <= n items(InputList), i++, string = ""; for(j=1, j<= n items(searchString) , j++, If( j == n items(searchString) | n items(searchString) == 1, string = string || "contains(words(\!"" || InputList[i] || "\!",\!"" || delimiter || "\!"),\!"" || searchString[j] || "\!")"; , string = string || "contains(words(\!"" || InputList[i] || "\!",\!"" || delimiter || "\!"),\!"" || searchString[j] || "\!") & "; ) ); If( Eval(Parse(string)), Insert Into(OutputList,InputList[i])); ); return(OutputList); );