AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Kleines Tool: SQL - TableToClass
Thema durchsuchen
Ansicht
Themen-Optionen

Kleines Tool: SQL - TableToClass

Ein Thema von Hobbycoder · begonnen am 11. Sep 2018 · letzter Beitrag vom 1. Jan 2024
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    
Hobbycoder
Registriert seit: 22. Feb 2017
Hi,

ich bin von Natur aus ein fauler Mensch (ob das auf alle Entwickler zutrifft kann und will ich nicht behaupten).
Jedenfalls ging es mir auf den Keks ständig das Klassengerüst für meine Datenbanktabellen zu schreiben. Jedenfalls bei 102 Tabellen + Views schon echt Arbeit.

Weil mir ja nun die DP und deren User wirklich viele gehen (nämlich ihre Zeit, um mir bei meinen Fragen und Problemen zu helfen), will ich mal was zurückgeben, sofern gewünscht.

Nun, dann schreibe ich mir halt ein kleines Tool, dass mir zumindest mal das 'Grobe' abnimmt. Herausgekommen ist ein doch recht nützliches Werkzeug.
Ich bin mir sicher, sowas gibt es schon. Trotzdem habe ich mich nicht auf die Suche gemacht, sondern einfach das ganze nach meinen Bedürfnissen umgesetzt.
Sicherlich arbeitet jeder Entwickler etwas anders, so dass es nicht für alle 'brauchbar' ist.
Wer aber sich schnell aus der Tabelle eines SQL-Servers eine Klasse erstellen will, der kann das nutzen.

Es ist kein Allrounder, sondern wirklich nur ein ganz kleines Tool, was nichts anderes macht, als die Felder aus einer Tabelle lesen, die Datentypen zu assoziieren und das ganze in eine Delphi-Klasse umzusetzen. Nicht mehr und nicht weniger. Zusätzlich erstellt es gleich eine TObjectList und packt auch die SQL-Abfrage gleich mit hinein. Eben so, wie ich es immer mache. So dauert jetzt das Erstellen eine Klassen-Unit zu einer neuen Tabelle statt 5-10 Minuten nur noch 15 Sekunden. Für mich eine echte Erleichterung.

Danach braucht man nur noch alles ein wenig nach seinen Bedürfnissen anpassen, dass zu löschen, was man nun nicht benötigt, und fertig.

Wer will kann sich das ja mal anschauen oder auch gerne nutzen.

Zur Zeit wird MySQL, MSSQL, Interbase/Firebird und ODBC unterstützt. Ich könnte aber noch andere DBMS aufnehmen, wenn der Bedarf besteht. Dann müsste ich es aber erst ein wenig umbauen.

Und wie gesagt, ich bin mir bewusst, dass es solche Tools bestimmt schon gibt. Aber ich wollte weder was kaufen, noch mir irgendwelche Softwarepakete installieren, sondern das einfach mal selbst machen.

Exe-Datei und Schreenshot im Anhang.

Feedback (in freundlicher Form) durchaus erwünscht.
Miniaturansicht angehängter Grafiken
tabletoclass2.jpg  
Angehängte Dateien
Dateityp: zip TableToClass.zip (3,29 MB, 118x aufgerufen)
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.

Geändert von Hobbycoder (24. Sep 2018 um 10:28 Uhr)
 
mkinzler

 
Delphi 11 Alexandria
 
#2
  Alt 11. Sep 2018, 11:01
Du könntest dir auch mal Marshmallow/Sping4D ansehen.

Dort ist auch ein entsprechendes Tool beinhaltet.

Delphi-Quellcode:
unit ORM.Model.Employee.CUSTOMER;

interface

uses
  Spring.Persistence.Mapping.Attributes,
  Spring.Persistence.Core.Graphics;

type
  [Entity]
  [Table('CUSTOMER', '')]
  TCUSTOMER = class
  private
    FCUST_NO: Integer;
    FCUSTOMER: string;
    FCONTACT_FIRST: string;
    FCONTACT_LAST: string;
    FPHONE_NO: string;
    FADDRESS_LINE1: string;
    FADDRESS_LINE2: string;
    FCITY: string;
    FSTATE_PROVINCE: string;
    FCOUNTRY: string;
    FPOSTAL_CODE: string;
    FON_HOLD: string;
  public
    [Column('CUST_NO',[cpRequired,cpPrimaryKey,cpNotNull],10,0)]
    property CUST_NO: Integer read FCUST_NO write FCUST_NO;
    [Column('CUSTOMER',[cpRequired,cpNotNull],25)]
    property CUSTOMER: string read FCUSTOMER write FCUSTOMER;
    [Column('CONTACT_FIRST',[],15)]
    property CONTACT_FIRST: string read FCONTACT_FIRST write FCONTACT_FIRST;
    [Column('CONTACT_LAST',[],20)]
    property CONTACT_LAST: string read FCONTACT_LAST write FCONTACT_LAST;
    [Column('PHONE_NO',[],20)]
    property PHONE_NO: string read FPHONE_NO write FPHONE_NO;
    [Column('ADDRESS_LINE1',[],30)]
    property ADDRESS_LINE1: string read FADDRESS_LINE1 write FADDRESS_LINE1;
    [Column('ADDRESS_LINE2',[],30)]
    property ADDRESS_LINE2: string read FADDRESS_LINE2 write FADDRESS_LINE2;
    [Column('CITY',[],25)]
    property CITY: string read FCITY write FCITY;
    [Column('STATE_PROVINCE',[],15)]
    property STATE_PROVINCE: string read FSTATE_PROVINCE write FSTATE_PROVINCE;
    [Column('COUNTRY',[],15)]
    property COUNTRY: string read FCOUNTRY write FCOUNTRY;
    [Column('POSTAL_CODE',[],12)]
    property POSTAL_CODE: string read FPOSTAL_CODE write FPOSTAL_CODE;
    [Column('ON_HOLD',[],1)]
    property ON_HOLD: string read FON_HOLD write FON_HOLD;
  end;

implementation


end.
Miniaturansicht angehängter Grafiken
codeentityeditor01.jpg  
Markus Kinzler
  Mit Zitat antworten Zitat
Hobbycoder
 
#3
  Alt 11. Sep 2018, 12:24
Mach ich. Danke.

Aber ich schrieb ja
Und wie gesagt, ich bin mir bewusst, dass es solche Tools bestimmt schon gibt. Aber ich wollte weder was kaufen, noch mir irgendwelche Softwarepakete installieren, sondern das einfach mal selbst machen.
Außerdem bin ich gerade dabei mir für beliebige Felder ein IndexOf bzw. SortBy automatisch mit einzubauen, dann spare ich mir noch mehr Auswand.
  Mit Zitat antworten Zitat
Hobbycoder
 
#4
  Alt 11. Sep 2018, 13:42
So, für alle, die es interessiert, ich habe noch ein paar kleine Verbesserungen vorgenommen:

- Kleine Fehler beseitigt
- Eigene Connection und eigene Query-Klasse kann angegeben werden (sonst ist es wirklich nur für mich nutzbar)
- Doppelklick auf die Feldliste zum Ändern des DatenTyps
- AutoInc wird erkannt und nicht mehr in den Inserts oder Updates als Feld verwendet
- Eine Sortierung zu jeder Property wird mit angelegt (Kann eingestellt werden)
- Ein IndexOf zu jedem Property wird mit angelegt (kann eingestellt werden)
- Weiterhin kann man für jede Feld dieses einzeln festlegen (Doppelklick auf Feld)

Die neue Version liegt im Anhang des ersten Post.
  Mit Zitat antworten Zitat
jobo

 
Delphi 2010 Enterprise
 
#5
  Alt 11. Sep 2018, 22:41
Hab's mal probiert. Ich kann leider nur mysql auswählen.
Sowas hab ich dann mal aus einer (alten) xampp Installation gestartet, bekomme aber kein Connect.
Es passiert nichts. Der Verbindungsdialog (Connection Manager) bleibt stehen.
Phpmyadmin geht dagegen.
Test Parameter:
Port laut xampp
Server localhost
user root
Schema verschiedene laut phpmyadmin probiert.
xampp, mysql sind auch 32bit wie die Anwendung.
Ja und jetzt wo ich nachschaue, mysql ist mariadb 10.1.26

Klick auf Abbrechen in Connection Manager bringt AV, die immer mehr werden.

P.S.: Avast macht ziemlich Wind, aber kennt man ja schon.
  Mit Zitat antworten Zitat
Hobbycoder
 
#6
  Alt 11. Sep 2018, 23:42
Hätte das nur auf meiner Entwicklungsmaschine getestet war vielleicht etwas zu Voreilig.
Und jetzt wo du‘s sagst....ein bisschen Errorhandling im Connection-Manager wär auch nicht schlecht

Ich werd das morgen mal auf einer Maschine Testen, die Jungfräulich ist..
ich könnte auch mal madExcept aktivieren. Dann kann man mit verpatztem.Errorhandling etwas mehr anfangen

Danke für die Rückmeldung. Wenn ich‘s dann korrigiert habe, würdest du das nochmal Testen?
  Mit Zitat antworten Zitat
jobo

 
Delphi 2010 Enterprise
 
#7
  Alt 12. Sep 2018, 08:46
Erfahrungsgemäß sind es ja irgendwelche lokalen Konstanten die woanders nicht passen, feste Verzeichnisse usw.
Ach und was mir einfällt, ich war so frech, das direkt aus dem ZIP zu starten. Und noch schlimmer: altes Windows 7.
Also wer weiß, was fehlt..
  Mit Zitat antworten Zitat
12. Sep 2018, 14:38
Dieses Thema wurde am "12. Sep 2018, 14:38 Uhr" von "mkinzler" aus dem Forum "Sonstige Werkzeuge" in das Forum "Software-Projekte der Mitglieder" verschoben.
jobo

 
Delphi 2010 Enterprise
 
#9
  Alt 12. Sep 2018, 20:53
So jetzt läuft es!
Das ist ja schon recht umfangreich, was Du generierst! Ich hab mal ein Test auf phpmyadmin Schema laufen lassen. Sicher wäre es nun sinnvoll, die generierten Klassen zu testen. Dazu werde ich sobald nicht kommen


@Conntection Manager
Ich finde es gewöhnungsbedürftig, dass er nicht zu geht nach Verbindung (falls das so sein soll), sonst geht es nur über X.
Trennen und Verbinden sind nicht richtig gekoppelt. Es geht scheinbar eine Verbindung mit mehreren DB. Fokus und Aktion passen dann nicht mehr.
Default und Default alle habe ich nicht verstanden, Default produziert AV.

Ich hab derzeit keinen Anwendungsfall, aber ich denke, es kann einem viel Arbeit abnehmen.
Frag mich gerade, ob sowas nicht in die IDE gehört. (Oder ist es schon drin, außer auf den billigen Plätzen?)
  Mit Zitat antworten Zitat
Hobbycoder
 
#10
  Alt 13. Sep 2018, 11:31
So jetzt läuft es!
Das ist ja schon recht umfangreich, was Du generierst! Ich hab mal ein Test auf phpmyadmin Schema laufen lassen.
Wobei ich allerdings nichts am Verbindungsaufbau selbst geändert habe. Ich habe lediglich ein ShowMessage für Verbindungsfehler hinzugefügt.


Sicher wäre es nun sinnvoll, die generierten Klassen zu testen. Dazu werde ich sobald nicht kommen
Also ich verwende das Tools jetzt für mein aktuelles Projekt (Neuerstellung eines alten D7-Projekts), in dem ich auch viele neue Tabellen anlege oder umbaue. Ich muss sagen, nach dem erstellen der Tabelle, starte ich kurz das Tool, lasse mir die Klasse erstellen, füge das in eine neue Unit ein, und kann sofort mit den Daten aus der DB arbeiten.
Zwar müssen die speziellen Anpassungen an mein Projekt trotzdem noch händisch erfolgen, aber ich merke jetzt schon das ich enorm Zeit einspare.


@Conntection Manager
Ich finde es gewöhnungsbedürftig, dass er nicht zu geht nach Verbindung (falls das so sein soll), sonst geht es nur über X.
Trennen und Verbinden sind nicht richtig gekoppelt. Es geht scheinbar eine Verbindung mit mehreren DB. Fokus und Aktion passen dann nicht mehr.
Default und Default alle habe ich nicht verstanden, Default produziert AV.
Den habe ich etwas überarbeitet. (Ich hatte den einfach aus einem anderen Projekt von mir geklaut ). Nun sollten die Buttons besser gekoppelt sein und nach dem Connect schließt sich der Connectionmanager auch.

Ich hab derzeit keinen Anwendungsfall, aber ich denke, es kann einem viel Arbeit abnehmen.
Frag mich gerade, ob sowas nicht in die IDE gehört. (Oder ist es schon drin, außer auf den billigen Plätzen?)
Tja, das hatte ich mir auch schon gedacht. Man könnte sich das unter Tools einfach einbinden. Nach dem Erstellen der Klasse macht mein Tool ja damit nichts mehr.
Um z.B. eine Funktion zu erstellen, die eine bestehende Klasse um weiter DB-Felder zu erweitern, müsste ich die Unit parsen um manuelle Veränderungen nicht zu eliminieren. Das würde mir aber zu aufwendig. Dafür kann man ja mit dem Tool die Tabelle auslesen, und die benötigten Teile händisch per Copy&Paste rüber kopieren.

Was vielleicht noch Sinn machen würde, wäre einen Interface-Teil zu integrieren. Aber dazu müsste ich mich erst mal mit Interfaces befassen, damit ich das machen könnte.

Ansonsten habe ich eine neue Version hochgeladen. Ich habe sie um ein paar nette Features erweitert. Unter Anderem in der Hinsicht, dass das Tool sich jetzt die Einstellungen zu jeder Tabelle einzeln wegschreibt (INI-Datei im gleichen Verzeichnis wie die EXE), und automatisch wieder lädt, sobald diese Tabelle wieder angeklickt wird. Und ein paar andere Kleinigkeiten.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz