Seite 5 von 7

Verfasst: 20.01.2008 16:45
von PBFetischist
Hallo mk-soft,

die LIB ist super und ich habe gleich eine Frage dazu (MySQL):

Kann ich denn eigentlich meinen eigenen DSN angeben? Jetzt wird ein DSN aus Programmname und Datenbank erzeugt. Das habe ich noch nicht hinbekommen, vielleicht habe ich auch etwas überlesen...

Grüße

Heiko

Verfasst: 20.01.2008 21:06
von mk-soft
hi,

wäre ein noch weitere optionaler parameter. bin der meinun das es nicht erforderlich ist, da man den dsn name auch weitergeben kann und eigendlich immer eindeutig ist.

FF :wink:

Verfasst: 21.05.2008 22:37
von ts-soft
@Michael
Könntest DD ja mal eine PM schicken, ob er es aufnimmt, im nächsten
PBOSL Update.
Allerdings fehlt noch die Hilfe, hm...

Gruß
Thomas

Verfasst: 01.06.2008 17:31
von mk-soft
Update

Hi,

da Tailbite jetzt mit PB4.20 läuft :allright: (Hier ein grossen Dank an die Entwickler von Tailbite)
ist jetzt die aktuelle Version für PB4.20 verfügbar :wink:

FF :wink:

P.S. Werde mich dann an die Hilfe setzen.

Download v1.09 (PB v4.20)
Download v1.08 (PB v4.02 und v4.10)

Verfasst: 03.06.2008 09:29
von dige
Die Erweiterung betrifft im wesentlich ein Vereinfachung mit dem DSN, oder?
Kann man damit auch ermitteln wieviel Datensätze eine SELECT-Abfrage
zurück liefert, oder muss man da auch erst mit NextDatabaseRow () alles
durchscannen?

Verfasst: 03.06.2008 09:38
von Kiffi
dige hat geschrieben:Kann man damit auch ermitteln wieviel Datensätze eine SELECT-Abfrage
zurück liefert

Code: Alles auswählen

Select Count(Feld) As Anzahl From Tabelle Where...
Grüße ... Kiffi

Verfasst: 03.06.2008 09:42
von dige
Danke Kiffi, das habe ich schon befürchtet. Es geht wirklich nur über
eine vorherige Count-Abfrage? Also quasi nicht alla:

NbRows = DatabaseRows (DbId)

Wenn man mit Joins und Subselects arbeitet wird das aber arg langsam..
Ich probier mal ob man mit ReDim was machen kann..

Verfasst: 03.06.2008 12:52
von Kiffi
dige hat geschrieben:Ich probier mal ob man mit ReDim was machen kann..
Du könntest alternativ LinkedLists verwenden.

Grüße ... Kiffi

Verfasst: 03.06.2008 14:55
von dige
Habs jetzt so gelöst ... und scheint ziemlich fix zu sein. Evtl. kann man
ja auch in 1.000er Schritten Dimensionieren...

Code: Alles auswählen

; Ermittele Anzahl DataBase Rows und kopiere das Ergebnis
; in ein Array für komfortablen Zugriff.. 
; DiGe german forum 03/06/08

Global Dim ODBCData.s(0, 0)
Global Rows.l, Cols.l

Procedure.l ODBC_GetTable (DbId.l, SQL.s)
  Protected Count.l = 100
  
  ; Global! Immer vorher zurücksetzen
  Cols = 0
  Rows = 0
  
  If IsDatabase(DbId) And DatabaseQuery(DbId, SQL)
    
    Cols = DatabaseColumns(DbId) - 1
    
    Dim ODBCData.s( Cols, Count )
    
    While NextDatabaseRow(DbId)
      
      If Rows = 0
        ; Spalten Namen zuweisen
        For i = 0 To ols
          ODBCData( i, 0 ) = DatabaseColumnName(DBid, i)
        Next
      EndIf
      
      Rows + 1
      
      ; Wenn Grenze erreich, Feld erneut vergrößern
      If Rows > Count
        Count + 100
        ReDim ODBCData.s( Cols, Count )
      EndIf
      
      ; Werte ins Feld übernehmen
      For i = 0 To Cols
        ODBCData( i, Rows ) = GetDatabaseString(DbId, i)
      Next
      
    Wend

  Else
    Debug DatabaseError()
  EndIf
ProcedureReturn Rows
EndProcedure

Verfasst: 04.06.2008 22:36
von PBFetischist
Du suchst ein Pendant zu odbc_num_rows() in PHP. Ich habe noch keinen ODBC Treiber gefunden bei der ich nach odbc_num_rows() NICHT -1 erhalten habe. Funktioniert so gut wie nie. (Access, DB2, SQL SERVER und Paradox getestet)

Mit deinem Beispiel durchläufst du ja leider auch alle Zeilen einmal.

Recht hast du, bei einer Micky Maus Abfrage kann ich die Query zweimal durchlaufen lassen, aber bei Subselects oder Unions dauert es einfach zu lange.

So mach ich es mit einer Linked List:

Code: Alles auswählen

        NewList dump.s()
        
        query.s= "Select * "
        query.s+ "FROM retourentabelle "
        If DatabaseQuery(0,query)
          Anz_Spalten = DatabaseColumns(0)
          While NextDatabaseRow(0)
            values.s = ""
            Columns.s = ""
            For SpalteNr = 0 To Anz_Spalten - 1
              columns+ DatabaseColumnName(0, SpalteNr)
              If SpalteNr < Anz_Spalten -1
                columns+ ","
              EndIf
              If DatabaseColumnType(0, SpalteNr) = 2
                values+ "'" + GetDatabaseString(0,SpalteNr) + "'"
                Else
                values+ GetDatabaseString(0,SpalteNr)
              EndIf
              If SpalteNr < Anz_Spalten -1
                values+ ","
              EndIf
            Next
            AddElement(dump())
            dump() = "insert into retourentabelle (" + Columns + ") values(" + values + ")"
          Wend
        EndIf
        Debug CountList(dump())