German scrollview mit Daten füllen

tudorf

Active Member
Licensed User
Longtime User
Hallo
Ich habe im Designer ein Scrollview erstellt und möchte den Inhalt einer Datei komplett zuweisen. Ich habe keine Ahnung von SQL. Ich verstehe nicht wie ich an die Daten komme. Wie komme ich an die Daten über die DBUtil? Auch bei DBUtil ist immer nur die Rede von SQL. Gibt es eine Möglichkeit ohne SQL eine einfache Datei zu bearbeiten? Die Tutorial und die Beispielprogramme habe ich durchgeschaut aber verstehe nur Bahnhof.
Danke Tudorf
 

cmweb

Active Member
Licensed User
Longtime User
Hallo
Ich habe im Designer ein Scrollview erstellt und möchte den Inhalt einer Datei komplett zuweisen. Ich habe keine Ahnung von SQL. Ich verstehe nicht wie ich an die Daten komme. Wie komme ich an die Daten über die DBUtil? Auch bei DBUtil ist immer nur die Rede von SQL. Gibt es eine Möglichkeit ohne SQL eine einfache Datei zu bearbeiten? Die Tutorial und die Beispielprogramme habe ich durchgeschaut aber verstehe nur Bahnhof.
Danke Tudorf

Um was für eine Datei geht es denn?

Wie sieht deren Inhalt aus?

SQL benötigst Du nur für Datenbanken.

Herzliche Grüße

Carsten

Gesendet von meinem GT-N7000 mit Tapatalk 2
 

tudorf

Active Member
Licensed User
Longtime User
Hallo Carsten
Ich möchte in einer Datei Daten zum Geocachen speichern. Also Textfelder (GC-Code, Längen- und Breitengrad, Bescheibung und Hinweis) natürlich mit gültigen Feldnamen. Die Datei wird später evtl mal 20 Datensätze haben. Ich finde aber das auch eine Datei mit evtl 50 oder 100 Datensätze nicht sehr groß ist. Hinzu kommt noch ein Feld im Scrollview das sich beim Aufruf berechnet. Die Entfernung zwischen den gespeicherten Koordinaten und meiner aktuellen Position. Idelaerweise aufsteigend sortiert. Für so eine kleine Datei SQL einzusetzen ist für mich als wenn man mit Kanonen auf Spätzen schiesst.

Ich arbeite seit über 30 jahren mit Datenbanken ohne SQL zu vermissen. Die gesamte Firmensoftware bei uns ist von mir. Mit etlichen Dateien und etlichen tausend Datensätzen in den Dateien. Am liebsten sind mir kleine Dateien z.B. im dbase-Format. Wenn ich so einen Datenbankteiber einbinden könnte hätte ich später mal die Möglichkeit direkt auf meine Firmendaten zuzugreifen. Aber das ist z.Z. nicht gplant.

Es gibt hier im Forum viele tolle Beispiele. Sie zeigen alle was alles machbar ist. Alles ist Codemäßig optimiert und so überladen dass ich den Kern nicht sehe oder verstehe.

Wahrscheinlich liegt es bei mir am Alter. In meiner Schulzeit gab es keine Computer. Alles habe ich mir selber beigebracht. Ich bin nur Hobbyprogrammierer. Englischunterricht hatte ich bis 1975 und brauche auch kein Englisch. Deshalb sind mir die englischsprachigen Unterlagen keine große Hilfe.

Ich hoffe, das mir keine meine blöden Fragen übel nimmt.

MfG Tudorf
 

cmweb

Active Member
Licensed User
Longtime User
Hi,

Sind die Daten dann kommasepariert, also CSV?

Dann einfach mit file.readlist die Datei einlesen und die Liste dann in einer for-next-Schleife abarbeiten, Zeile für Zeile die Daten extrahieren und weiter verarbeiten...

Herzliche Grüße

Carsten

Gesendet von meinem GT-N7000 mit Tapatalk 2
 

tudorf

Active Member
Licensed User
Longtime User
Hallo Carsten
Eine CSV-Datei ist ungünstig. Da es sich um Freie Eingabetexte handelt können auch Komma vorkommen.

Ich weiß das das dbase-Format uralt ist. Aber man kann so einfach auf einzelne Datensätze gehen und einzelne Felder lesen und schreiben. Text, Numerisch, Datum, Logisch sogar BLOB war da schon möglich. Ich trauere dem auch nicht hinterher nur SQL verstehe ich nicht.

Ich wollte mit folgenden Code versuchen an die Inhalte zu kommen. GCcode, infotext sind Felder in meiner SQL-Datenbank. Erstellt mit SQ-Light.

Sub Activity_Create(FirstTime As Boolean)
If File.Exists(DBFileDir, DBFileName) = False Then
If FirstTime Then
File.Copy(File.DirAssets, DBFileName, DBFileDir, DBFileName)
SQL1.Initialize(DBFileDir, DBFileName, True)
End If
Else
If FirstTime Then
SQL1.Initialize(DBFileDir, DBFileName, True)
End If
End If
Dim Cursor As Cursor
Cursor = SQL1.ExecQuery("SELECT GCcode, infotext FROM table1")
For i = 0 To Cursor.RowCount - 1
Cursor.Position = i
Log(Cursor.GetString("GCcode"))
Log(Cursor.GetInt("infotext"))
Next
Cursor.Close
End Sub

Leider wird auf meinem Rechnet unter dem Emulator die Datenbank nicht gefunden. Wenn ich zuhause arbeite ist mein S3 über WLan angeschlossen und ich arbeite mit der Bridge. In der Firma habe ich kein WLan. Daher der Emulator.

Die Variablen File.DirRootExternal und File.DirInternal weisen auf Verzeichnisse auf dem Handy hin. Bei der Zuwesiung von
DBFileDir = "Basic4Android\Wagner\Files" und
DBTableName = "mystery" ergibt der Aufruf " File Not found."

Ich habe auch kein Beispiel gefunden wo ein Verzeichnis vorgegeben wurde oder das Prgramm auf eine datenbank zugreift. Selbst das Beispiel DBUtils erstellt eine Datei und füllt diese per Programm mit Beispieldaten. Für eine Demo ist das OK, hat aber mit einer späteren Anwendung nicht gemeinsam.

Wie kann ich auf eine Datenbank unter dem Emulator zugreifen ?

Gruß Martin
 

cmweb

Active Member
Licensed User
Longtime User
Ich kann Dir irgendwie nicht folgen.

SQL verstehst Du nicht, hast aber eine SQL Datenbank?

dBase kenne ich wiederum nicht so gut. Ob man per Basic4Android dBase Datenbanken nutzen kann, weiß ich nicht...

Herzliche Grüße

Carsten

Gesendet von meinem GT-N7000 mit Tapatalk 2
 

tudorf

Active Member
Licensed User
Longtime User
Hallo Carsten

Mein ursprüngliche Frage war, obe eine Alternative Datei zu SQL gibt.

- CSV halte ich für unglücklich. Man könnte zwar komma im Text separieren und durch einen andern Platzhalter ersetzen und später das selbe wieder rückwärts. Halte ich aber für eine Notlösung
- Ein Dateiformat wie dbase schein es nicht zu geben. Also ein einfaches Format das Aussieht wie in Excel, Die Auifsteigenden Zahlen sind die Sätze und die Spalten a b usw. sind die Feldnamen (die man ja auch umbenennen kann). Dann kann dan mit einfachen Befehlen goto(satz), get(Inhalt_von_feld_a), put(Inhalt_von_feld_a,neuer_inhalt) auf alle Inhalte zugreifen.
- SQL. Nun da werde ich mich wohl mit beschäftigen müssen.

andere Alternativen habe ich nicht gefunden.

Trotzdem danke
Martin
 

tudorf

Active Member
Licensed User
Longtime User
Hallo
Ich kann nun über SQL auf die Daten zugreifen. Zumindest werden die Daten über Log(Cursor.GetString("GCcode")) ausgegeben.

Leider ist mein Scrollview leer. Mein Programm habe ich mal angehängt.

Danke für eine kurzfristge Hilfe.
MfG Martin
 

Attachments

  • Mystery.zip
    7.1 KB · Views: 315

cmweb

Active Member
Licensed User
Longtime User
Hallo
Ich kann nun über SQL auf die Daten zugreifen. Zumindest werden die Daten über Log(Cursor.GetString("GCcode")) ausgegeben.

Leider ist mein Scrollview leer. Mein Programm habe ich mal angehängt.

Danke für eine kurzfristge Hilfe.
MfG Martin

Kann ich leider nicht testen, weil die Datenbank fehlt...

Herzliche Grüße

Carsten
 

tudorf

Active Member
Licensed User
Longtime User
Sorry. Anbei die Zip mit Datenbank.
MfG Martin
 

Attachments

  • Mystery.zip
    8.1 KB · Views: 287

cmweb

Active Member
Licensed User
Longtime User
In dieser Zeile

B4X:
ScvGC.Panel.AddView(l, TotalColumnWidth(i), RowHeight * NumberOfRows, _
      ColumnWidth_1(i), RowHeight_1)

sind TotalColumnWidth(i) sowie ColumnWidth_1(i) jeweils 0.

Dementsprechend sind zwar Deine Labels gefüllt, aber sie sind halt 0 dpi breit, ergo nicht sichtbar.

Herzliche Grüße

Carsten
 

klaus

Expert
Licensed User
Longtime User
Wie schon von cmweb erwähnt fehlt die Rechnung der TotalColumnWidth(i) sowie ColumnWidth_1(i) Werte.
Damit zwischen den Labels Linien angezeigt werden werden die Labels um die Liniendicke ColLoneWidth verschoben.
ColumnWidth entspricht der Spaltenbreite
ColumnWidth_1 entspricht der Labelbreite (Spaltenbreite minus Linienbreite)
TotalColumnWidth entspricht der Linkskoordinate der Labels oder auch der kumulierten Spaltenbreite.

Beiliegend findest Du eine geänderte Version des Programms mit obiger Änderung.
Habe auch die Kopfzeile und einen Schieber zum waagrechten verschieben der ScrollView zugefügt.

Beste Grüsse.
 

Attachments

  • Mystery_1.zip
    8.7 KB · Views: 268

tudorf

Active Member
Licensed User
Longtime User
Danke an euch beiden. Auf der Basis mache ich mal weiter.
MfG Martin
 

tudorf

Active Member
Licensed User
Longtime User
Hallo
Ich habe nochmal ein Verständnisproblem.

Ich möchte eine selectierte Zeile ändern. Dafür habe ich ein neues Activity "Edit" mit Edittexten angelegt. Nach drücken auf den Button"save" sollen die neuen daten gespeichert und zum Hauptfenster "Main" zurückgekehrt werden.

Nun habe ich 2 Fragen.
- Obwohl im Activity "Main" Variablen unter Process_Globals definiert sind kennt das Activity "Edit" diese nicht. z.B. SQL, DBTableName usw. Warum ?

- Beim Speichern ist das Edittext nicht definiert obwohl die DIM Anzeigung an unterschiedlichen Stellen eingefügt wurde.

Ist dieser Aufbau mit einzelnen Activitys falsch oder ungünstig? Das Beispiel SQLSample hat mehrer Layouts und brint das aktuelle immer nach oben.

Martin
 

Attachments

  • Mystery.zip
    11.2 KB · Views: 282
Last edited:

cmweb

Active Member
Licensed User
Longtime User
Zur ersten Frage.

Die Variable SQL muss von der anderen Activity aus mit Main.SQL angesprochen werden.

Die zweite Frage verstehe ich ad hoc nicht...

Herzliche Grüße

Carsten

Gesendet von meinem GT-N7000 mit Tapatalk 2
 

klaus

Expert
Licensed User
Longtime User
Du musst die Variabledefinitionen in Edit.Process_Globals raus nehmen, doppelte Definition !
Dann musst Du im anderen Activitymodul den Process globalen Variablen das Prefix Main. vorsetzen:
B4X:
Sub btnSave_Click
    Dim txt As String

    Msgbox(EditGCcode.Text,"aufruf")
    
    txt="UPDATE "& Main.DBTableName&" Set "& Main.ColumnName(1) &" = '" & EditGCcode.Text
    
    Main.SQL1.ExecNonQuery(txt)    

    Activity.Finish

End Sub
Dim EditGCcode As EditText muss aus obiger Routine auch raus, doppelte Definition !
In der Edit Layoutdatei musst du den EditText View Namen auf EditGCcode setzten und nicht EditText1 und nicht nur den EventName !
Du darfst nur einen Eintrag ändern, den mit dem ID des selektierten Eintrages, in Deinem Code werden ALLE Einträge mit dem gleichen Wert geändert !
Beiliegend eine neue Version mit noch einigen anderen Änderungen.

Beste Grüsse.
 

Attachments

  • Mystery_2012_08_02.zip
    11.4 KB · Views: 263

tudorf

Active Member
Licensed User
Longtime User
Danke für die Antwort.

Die doppte Definition war klar. Ich wußte mir nur nicht anders zu helfen.

Danke Martin
 

tudorf

Active Member
Licensed User
Longtime User
Ich habe die SQL-Datei geändert und die ColumnName und ColumnWidth angepasst. In der Exportierten SCV-Datei sind die neuen Felder vorhanden. B4A kennt sie aber nicht.

Kann ich unter dem Debugger die Datenbank ansehen ? Wo liegt das Problem ?

Martin
 

Attachments

  • Mystery.zip
    11.2 KB · Views: 285

tudorf

Active Member
Licensed User
Longtime User
Anbei nochmal die neue Datei von heute morgen.
Das Auslesen der Daten erfolgt über ein Array. Das habe ich wie folgt geändert.

Dim NumberOfColumns As Int : NumberOfColumns = 9
Dim ColumnName(NumberOfColumns) As String
ColumnName(0) = "ID"
ColumnName(1) = "GCcode"
ColumnName(2) = "infotext"
ColumnName(3) = "laenge"
ColumnName(4) = "breite"
ColumnName(5) = "norda"
ColumnName(6) = "nordb"
ColumnName(7) = "osta"
ColumnName(8) = "ostb"
Dim ColumnWidth(NumberOfColumns) As Int
ColumnWidth(0) = 50dip
ColumnWidth(1) = 100dip
ColumnWidth(2) = 100dip
ColumnWidth(3) = 150dip
ColumnWidth(4) = 100dip
ColumnWidth(5) = 100dip
ColumnWidth(6) = 100dip
ColumnWidth(7) = 100dip
ColumnWidth(8) = 100dip
Weiterhin natürlich die SQL. Die neuen Felder sind auch in der SQL. Weiterhin Felder mit anderen Namen die auch nicht funktionieren. Auch die umstellung von INT auf TEXT brauche nichts.

Weiterhin habe ich alle Mystery.db auf meiner HD gelöscht um sicher zu stellen dass ich keine falsche (alte) Datei anspreche. Verzeichnis überprüft, ist auch OK.

Wie komme ich an die Datei unter B4A im Debugger um die Felder direkt auszulesen?
Martin
 

Attachments

  • mystery_20120803.zip
    54.6 KB · Views: 266
Top