German SQLite - Spaltenanzahl (Feldanzahl) einer Tabelle ermitteln

Amalkotey

Active Member
Licensed User
Longtime User
Hallo,

nach dem mir Specci48 mit dem Ermittlung der Anzahl der Datensätze einer Tabelle geholfen hat, habe ich nunmehr ein weiteres Problem und hoffe, dass ihr mir helfen könnt.

Gibt es meine Möglichkeit, die Anzahl der vorhandenen Spalten (Feldern in einer Tabelle) zu ermitteln?

Vielen Dank für euere Hilfe im voraus.

MfG
Amalkotey
 

berndgoedecke

Active Member
Licensed User
Longtime User
Tabellenparameter

Hallo Amalkotey,
Ich ermittele die erforderlichen Tabellenparameter über eine Sub namens GetParams und übergebe dieser Sub den Tabellennamen, um dann Globale Arrays durch StrSplit zu erzeugen.
Hier ist ein Ausschnitt dieser Prozedur. Ein lauffähiges Beispiel, aus meinem Gesamtprojekt zu extrahieren, würde etwas länger dauern.
Ich hoffe es hilft auch so weiter:
Public Sub GetParams(N)
cmd.CommandText = "PRAGMA table_info ('" & N & "')" 'Special SQLite command to find the table's metadata.
reader.Value = cmd.ExecuteReader
Do While reader.ReadNextRow = True
SpNamStr = SpNamStr & reader.GetValue(1) & "|"
SpTypStr = SpTypStr & reader.GetValue(2) & "|"
SpNullStr = SpNullStr & reader.GetValue(3) & "|"
SpDefaultStr = SpDefaultStr & reader.GetValue(4) & "|"
SpPkStr = SpPkStr & reader.GetValue(5) & "|"
Loop
SpNamStr = SubString(SpNamStr,0,StrLength(SpNamStr)-1)
SpTypStr = SubString(SpTypStr,0,StrLength(SpTypStr)-1)
SpNullStr = SubString(SpNullStr,0,StrLength(SpNullStr)-1)
SpDefaultStr = SubString(SpDefaultStr,0,StrLength(SpDefaultStr)-1)
SpPkStr = SubString(SpPkStr,0,StrLength(SpPkStr)-1)
reader.Close
'tpk = PrimKey(AktTab)
'Msgbox ("FKey:" & tpk, "SQLeasy", cMsgboxOK, cMsgboxExclamation)
SpNam() = StrSplit(SpNamStr, "|")
SelSpNam() = StrSplit(SpNamStr, "|")
SpTyp() = StrSplit(SpTypStr, "|")
SelSpTyp() = StrSplit(SpTypStr, "|")
SpNull() = StrSplit(SpNullStr, "|")
SpDefault() = StrSplit(SpDefaultStr, "|")
SpPk() = StrSplit(SpPkStr, "|")
DebStr = DebStr & SpNamStr & CRLF & SpTypStr & CRLF & SpNullStr & CRLF & SpDefaultStr & CRLF
SpAnz = ArrayLen(SpNam())
SelSpAnz = SpAnz
End Sub

Viele Grüße
berndgoedecke
 

Amalkotey

Active Member
Licensed User
Longtime User
Moin Bernd,

vielen Dank für Deine Lösung. Auf die schnelle habe ich nachfolgenden Code geschrieben:

B4X:
Public Sub GetTableCount(DataTable)
  Connection.BeginTransaction
  Command.CommandText = "Select count(*) from " & DataTable
  Data.Value = Command.ExecuteReader
  Result = -1
  If Data.ReadNextRow = True Then
    Result = Data.GetValue(0)
  End If
  Data.Close
  Connection.EndTransaction
  Return Result
End Sub

Sub GetColumnsCount(DataTable)
  AddForm("frmTemp", "")
  frmTemp.Visible = False
  AddTable("frmTemp", "Table1", 2, 2, 2, 2)
  Rows = GetTableCount(DataTable)
  Connection.BeginTransaction
  Command.CommandText = "SELECT * FROM " & DataTable 
  Command.ExecuteTable("Table1", Rows)
  Connection.EndTransaction
  Result = Table1.ColCount
  Table1.Dispose
  frmTemp.Dispose
  Return Result
End Sub

Ich werde morgen mal Deine Version mal testen.

MfG
Amalkotey
 
Last edited:

Amalkotey

Active Member
Licensed User
Longtime User
Moin Bernd,

so ich habe Deine Routine in meinem Quellcode eingefügt und angepaßt. Funktioniert super! Nochmals vielen Dank.

MfG
Amalkotey
 
Last edited:

berndgoedecke

Active Member
Licensed User
Longtime User
SQL.bas

Hey Amalkotey,
ich hab mir mal deine SQL.bas angeschaut, natürlich insbesondere die GetParams Funktion und ich habe bei der Verwendungsart schon bedenken, was die Geschwindigkeit der Anwendung anbelangt.
Weil jedesmal die gesamte Table_Info ausgelesen wird, diverse Strings zusammengebaut und wieder auseinandergenommen werden. Das kostet doch schon einiges an Rechenleistung und ist meines erachtens Verschwendung wenn nur ein Parameter zurückgegeben wird.

Ich wende diese Funktion normalerweise einmal an, bevor ich die Tabelle öffne.
Die Informationen befinden sich dann in z.B. SpNam(x).
Wenn das Array Public dimensioniert wird kann in deinem Fall mit SQL.SpNam(x) darauf zugegriffen werden.
Die Sache mit SelSpNam(x) kannst du dir eigentlich sparen weil ich diese Option verwende wenn einzelne Spalten ausgeblendet werden.

Für eine Funktion die gezielt, einzelne Parameter aus der Table_Info extrahieren soll, würde ich die Anzahl der erforderlichen Rechenoperationen noch optimieren.

Wenn sich das Thema SQLite auf Desktop und Device als eines deiner Lieblingsthemen entwickeln sollte, freue ich mich auf jeden Fall auf eine gute Zusammenarbeit, sofern es die Zeit erlaubt.

Grüße
Bernd Gödecke
 

Amalkotey

Active Member
Licensed User
Longtime User
Hallo Bernd,

Danke für die Infos. Ich benutze die SQL.BAS für ein Projekt, welches auf Windows Mobile-Handys laufen soll. In der Datenbank werden insgesamt sieben Tabellen angelegt, wobei aber nur bei drei Tabellen sowie zwei weitere Tabellen eine Relation besteht. Hierbei fallen nicht viele Daten an, so dass die Perfomance keine große Rolle spielt. Die Tests laufen auf ein Samsung SGH-i900 Omnia und auf ein HTC-Handy, welche beide mit 400 Mhz bzw. 528 Mhz getaktet sind. Bei den neueren Handy - mit 800 bis zu 100 Mhz - sehe ich keine Probleme.

Für Windows werde ich nicht mit Basic4PPC entwickeln, da ich mich auf Delphi 7 bzw. Delphi2010, C++ sowie Vb.net / C# (Was der Kunde eben wünscht!) eingeschossen habe, welche wenigstens einen nativen Code compilieren.

Ich werde mir mal Gedanken machen, wie man die SQLParams-Sub optimieren kann. Über einen weiteren Gedankenaustausch würde ich mich freuen. Aus welcher Ecke kommst Du? Entwickeltst Du hauptberuflich Software?

MfG
Amalkotey
 

berndgoedecke

Active Member
Licensed User
Longtime User
Antwort

Aus welcher Ecke kommst Du? Entwickeltst Du hauptberuflich Software?

MfG
Amalkotey

Hallo Amalkotey,
zunächst zu deinen letzten Fragen:
1.) Ich komme aus Wuppertal. Ca. 54km von Oberhausen entfernt.
2.) Nein. Ich habe in den letzten 23 Jahren, die Programmierung, überwiegend in verschiedenen Basic-Varianten, als mein Hobby ausgebaut.

Und weil das so ist, ist meine Zeit recht begrenzt und Antworten können schon mal etwas länger dauern.

Bei der Kombination von SQLite und einem mobilen Basic interessierte mich zuerst die Möglichkeit ein Abbild eines SAP-Datenbestands mobil verfügbar zu haben und Daten vor Ort überprüfen zu können.
Diesen Stand hatte ich bereits vor ca.2 Jahren, mit dem mobilen "NSBasic" erreicht, dass sich aber aufgrund mangelnder Framework-kompatipilität erledigt haben dürfte.
Beruflich arbeite ich, anwenderseitig mit dem SAP-Planned Maintenance(PM) Modul, Instandhaltung, in diesem Fall von Labor- und Medizingeräten einer Klinik.

Wie ich gelesen habe, arbeitest du gerade mit dem SAP Buisiness-Modul.

Im SAP-PM Modul gibt es die Möglichkeit einer "Dynamischen Listausgabe".
Abfragen, die als quasi CSV (Trennzeichen = |)Tabellen exportiert werden können.
Da würde mich interessieren, ob es diese Möglichkeit auch bei BI gibt, weil ich nämlich diese Daten nach SQLite konvertiere um Sie mobil verfügbar zu haben. Die Konvertierung findet natürlich auf dem Desktop statt. Da der Umfang der Daten doch recht groß ist.

Genug gequatscht..

Bis Demnächst mal

Bernd Gödecke
 

Amalkotey

Active Member
Licensed User
Longtime User
Moin Bernd,

du hast recht, am 24.06.2010 mache ich meine BI-Berater Zertifizierung.

ich würde die Daten aus dem InfoProvider als XML aus SAP - als flache Datei - exportieren und mit der XmL-Library in Basiv4PPC reinholen. Somit kannst du ohne viel Konvertierung die Daten SLLite spei Ich dechern.

Die Frage ist nur, ob du bei dem InfoProvider (InfoCupe, DSO usw.) die Berechtigungen da zu hast. Ich Denke, das wir dieses Thema im Juli diskutieren können, dann habe ich wenigstens meine Berater-Aubildung beendet.

Gruss
Bodo (Amalkotey)
 
Top