Seite 3 von 4

ja, ja bitte!!!!

Verfasst: 04.11.2005 23:18
von hiltwin
Kiffi hat geschrieben:> Sollen wir Dir einen kleinen Beispielsource posten, der eine CSV-Datei
einliest?

Grüße ... Kiffi
Ja bitte - und am besten auch gleich das Gegenstück zum Auslesen /:-> - weil ich doch jetzt auch den Zitierknopf gefunden habe :allright:

Verfasst: 05.11.2005 00:04
von freedimension
vonTurnundTaxis hat geschrieben:@Mauli:
Was macht denn UpdateString()?
Na ich schätze mal dasselbe was ein SQL-Update macht, Daten ändern.

Verfasst: 05.11.2005 02:16
von Andre
@Mauli: das Programm sieht ja ziemlich professionell aus. Etwas Ähnlichkeit mit SAP/R3... :mrgreen:

Verkaufst Du das auch oder ist es nur für den Eigenbedarf?

Verfasst: 05.11.2005 14:48
von PAMKKKKK
@freedimension
Kiffi hat geschrieben:
freedimension hat geschrieben::( *streitbarriere_erricht* :)
ach! Wir streiten doch nicht. Wir diskutieren! :D
Kiffi und ich Diskutieren halt gerne :wink: Ausserdem habe ich ihn schon zu meinem Lieblingsfeind erklärt.Bild
Peter+Peter streiten sich gern :lol:
Mauli hat geschrieben: ich habe mich mit SQL lange beschäftig und sehe wirklich ein, daß es eine großartige Sache ist, aber ich war schlichtweg zu Faul, das Programm (6000) Zeilen auf MySQL3 umzuschreiben.
Eben deshalb sollte man erst garnicht mit CSV anfangen......grummel, grummel, grummel
Mauli hat geschrieben:Finde es auch so sehr gut und kann es jedem nur Raten, erstmal damit zu arbeiten, bevor man sich ans SQL wagt. Ich bin sehr zufriefen und sehe keinen Grund zu wechseln.
Kann ich niemanden raten! (bei Professionellen Programmen) :roll:

Verfasst: 05.11.2005 16:23
von Mauli
Das Programm heißt nun KS-Auftrag, und KS-Cash wobei das "K" im Logo gespiegelt ist. Der Screenshot ist von der alten Version - werde heute abend mal die Aktuellen Screenshots servieren. Sieht noch besser aus !

Ne Vorlage hatte ich nicht dafür, einfach drauflos und fertig. Nach meinen Bedürfnissen ohne viel geklicke schnell zum Ergebnis und vorallem alles auf einem Blick, ohne suchen. Tja, da ist das Ergebnis ... habe es bisher (leider) nur 4x verkauft aber ich arbeite dran .

Verfasst: 05.11.2005 16:27
von Then
@Mauli : bin mal gespannt - sieht aber sehr vielversprechend aus. Endlich mal was anderes als Spiele und DEMOs. Ne vernünftige Anwendung die auch wirklich genutzt wird und nen Sinn hat. So soll es sein.
Mein CNC-Commander zum Fräsen habe ich nun schon 23 mal verkauft und gutes Geld verdient. Eine größere Firma will mir sofort 50-70 Stück abkaufen, wenn deren Fräsen auch damit laufen - muß es extra anpassen und deren Logo mit einbinden. Dann winkt erstrecht Kohle ! :D

Naja, weiter so ! Solche kompletten Anwendungen die wirklich funktionieren und eingesetzt werden lobe ich mir - egal ob SQL oder CSV. Jedem das was er am besten kann, bzw, was am schnellsten ist !

Verfasst: 05.11.2005 16:30
von Mauli
UpdateString(Nummer, Position, Wert) ist wie der SQL Befehl. Er Updatet den jeweiligen Wert mit + oder - !

Tja, alles recht fix !

Verfasst: 05.11.2005 17:56
von Mauli
So, hier nu die aktuellsten Screenshots :

Bild

Bild

Da ich mich nun selbstständg machen werde, benötigte ich ein Programm, dessen Einarbeitung ich sparen wollte, also selbstgeschrieben und fertich ! Inkl. autom. Mahnwesen, RMA-Abwicklung (mit den dazugehörenden Formularen und Vordrucken) und allem was man benötigt (Rechnung, Liferschein oder Barverkauf (KS-Cash) )

Re: ja, ja bitte!!!!

Verfasst: 06.11.2005 00:06
von Kiffi
hiltwin hat geschrieben:
Kiffi hat geschrieben:> Sollen wir Dir einen kleinen Beispielsource posten, der eine CSV-Datei einliest?
- und am besten auch gleich das Gegenstück zum Auslesen /:->
äh, wenn Du mir jetzt noch den Unterschied zwischen Einlesen und Auslesen erklärst... ;-)
hiltwin hat geschrieben:Ja bitte
OK. Hier kommt der Code:

Code: Alles auswählen

Global CsvLines.l, CsvFields.l

Procedure ReadCSV(sFile.s)
  
  DefType.s sSeparator, sLine
  DefType.l FF, lLineCounter, lFieldCounter, lMaxFieldCounter
  
  sSeparator = ";"
  
  CsvLines  = -1
  CsvFields = -1
  
  FF = ReadFile(#PB_Any, sFile)
  
  If FF
    
    ; Pass 1
    ; Determine count of lines and fields
    
    While Eof(FF)=#False
      
      sLine = ReadString()
      
      If Trim(sLine) <> "" ; Line contains data?
        
        lLineCounter + 1
        
        lFieldCounter = CountString(sLine, sSeparator) + 1
        
        If lMaxFieldCounter < lFieldCounter
          lMaxFieldCounter = lFieldCounter
        EndIf
        
      EndIf
      
    Wend
    
    Debug "Found " + Str(lLineCounter) + " lines"
    Debug "Found " + Str(lMaxFieldCounter) + " fields"
    
    ; Dimension Array with determined informations
    
    CsvLines  = lLineCounter - 1
    CsvFields = lMaxFieldCounter - 1
    
    Dim FieldArray.s(CsvLines, CsvFields)
    
    ; Pass 2
    ; Read Data
    
    FileSeek(0) ; Jump to the start of the file
    
    lLineCounter = 0
    
    While Eof(FF)=#False
      
      sLine = ReadString()
      
      If Trim(sLine) <> "" ; Line contains data?
        
        For lFieldCounter = 1 To CountString(sLine, sSeparator) + 1
          FieldArray(lLineCounter, lFieldCounter-1) = StringField(sLine, lFieldCounter, sSeparator)
        Next lFieldCounter
        
        lLineCounter + 1
        
      EndIf
      
    Wend
    
    CloseFile(FF)
    
  Else
    
    ; Couldn't open file
    
  EndIf
  
EndProcedure

Enumeration
  #frmMain ; MainWindow
  #ligView ; ListIconGadget
EndEnumeration

DefType.s sLine
DefType.l lField, lLine

ReadCSV("test.csv")

If CsvFields > -1 And CsvLines > -1
  
  If OpenWindow(#frmMain, 0,0,420,200, #PB_Window_ScreenCentered|#PB_Window_SystemMenu, "Read CSV - Sample")
    
    If CreateGadgetList(WindowID(#frmMain))
      
      ; Use a ListIconGadget to view the read data
      
      ListIconGadget(#ligView, 0, 0, 420, 200, "Field0", 40, #PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
      
      ; Fill Columnheaders of ListIconGadget
      
      For lField = 1 To CsvFields 
        AddGadgetColumn(#ligView, lField, "Field" + Str(lField), 40)
      Next lField
      
      ; Fill data into ListIconGadget
      
      For lLine = 0 To CsvLines
        sLine = ""
        For lField = 0 To CsvFields
          sLine + FieldArray(lLine, lField)
          If lField <> CsvFields
            sLine + Chr(10)
          EndIf
        Next lField
        AddGadgetItem(#ligView, lLine, sLine)
      Next lLine
      
      Repeat
        
      Until WaitWindowEvent() = #PB_Event_CloseWindow
      
    EndIf
    
  EndIf
  
EndIf
Entsprechende Beispiel-CSV:

Code: Alles auswählen

00;01;02;03;04;05;06;07;08;09
10;11;12;13;14;15;16;17;18;19
20;21;22;23;24;25;26;27;28;29
30;31;32;33;34;35;36;37;38;39
40;41;42;43;44;45;46;47;48;49
50;51;52;53;54;55;56;57;58;59
60;61;62;63;64;65;66;67;68;69
70;71;72;73;74;75;76;77;78;79
80;81;82;83;84;85;86;87;88;89
90;91;92;93;94;95;96;97;98;99
Ein paar Anmerkungen zum Code:

1.) Es gibt verschiedene Arten und Weisen, CSV-Dateien einzulesen. Ich
habe mich für obige Variante entschieden, weil sie flexibel ist. Man muss
zuvor nicht wissen, wieviele Felder eine Zeile enthält. Das wird im ersten
Arbeitsschritt (Pass 1) ermittelt. Dadurch ist die Routine allerdings
langsamer, weil die Datei zweimal durchlaufen werden muss. Bei den
knapp 500 Artikeln, die Earl Grey anvisiert, dürfte dass allerdings kaum
in's Gewicht fallen.

Eine weitere Möglichkeit der Geschwindigkeitsoptimierung kann man
nutzen, wenn man die FastFile-Routinen von Rings aus dem PBOSL-Paket
anstelle der Standard-Dateibefehle von PureBasic verwendet

2.) Es kann sein, dass in einem Feld (beispielsweise der
Artikelbezeichnung oder -beschreibung) der Feldseparator (hier: das
Semikolon) als Satzzeichen verwendet wird. Damit dieses nicht als
Feldseparator angesehen wird, fasst man das Feld üblicherweise in
Textbegrenzer ein.

Beispiel:

Code: Alles auswählen

Artikelnummer0815;"Artikelbezeichnung;BlaBla";Artikelpreis
Man sieht: Obige Zeile hat 3 (!) Felder, weil das Semikolon als
Satzzeichen der Artikelbezeichnung zugehörig ist. Dafür sorgen die
Hochkommata am Anfang und Ende des Feldes.

Mein Code berücksichtigt das nicht!

Ich bin im Moment zu faul, um das noch einzubauen. ;-)

Grüße ... Kiffi

Re: ja, ja bitte!!!!

Verfasst: 06.11.2005 00:21
von freedimension
Kiffi hat geschrieben:2.) Es kann sein, dass in einem Feld (beispielsweise der
Artikelbezeichnung oder -beschreibung) der Feldseparator (hier: das
Semikolon) als Satzzeichen verwendet wird. Damit dieses nicht als
Feldseparator angesehen wird, fasst man das Feld üblicherweise in
Textbegrenzer ein.

Beispiel:

Code: Alles auswählen

Artikelnummer0815;"Artikelbezeichnung;BlaBla";Artikelpreis
Man sieht: Obige Zeile hat 3 (!) Felder, weil das Semikolon als
Satzzeichen der Artikelbezeichnung zugehörig ist. Dafür sorgen die
Hochkommata am Anfang und Ende des Feldes.
Noch eine kurze Anmerkung hierzu: Es kann natürlich auch vorkommen, dass in Feldern auch mal Hochkommata enthalten sind. Diese werden dann normalerweise verdoppelt dargestellt. Wenn das BlaBla aus obigem Beispiel also in Hochkommata stehen sollte müsste das so aussehen:

Code: Alles auswählen

Artikelnummer0815;"Artikelbezeichnung;""BlaBla""";Artikelpreis
Eine saubere Zeile muss also immer eine gerade Anzahl an Hochkommata haben.