Traxsung
01-10-2005, 21:52
Sto realizzando un piccolo gestionale per l'azienda dove lavoro. Come linguaggio di programmazione o scelto Delphi. Per quanto riguarda invece le varie query sul database ho scelto sql e quindi mysql. Il progetto è ancora in fase di sviluppo solo che ho un problema che preferirei risolvere adesso. In pratica mi piacerebbe sapere come posso fare a far si che una volta terminato il mio gestionale... io possa realizzare un'eseguibile(l'installazione per capirci) così di poterlo installare in altri computer senza dover ogni volta installare mysql su ogni computer.
Inoltre visto che utilizzo un database mysql... vorrei sapere anche come posso fare per inblobarlo nell'exe.
So che rompo sempre... ma è meglio che risolva questo problema il prima possibile altrimenti poi mi ritrovo con il gestionale terminato... ma senza riuscire ad installarlo su altri computer.
cdimauro
03-10-2005, 11:18
Lavorando con Delphi, ti consigli di utilizzare InterBase (o FireBird, che è il ramo open source che è nato da IB 6): è supportato direttamente da Delphi, e inoltre è un engine SQL estremamente potente, veloce (non quanto MySQL, sia chiaro) e affidabile.
Te lo consiglio anche perché ti permette di centralizzare l'accesso al database, realizzando dei tiny client: buona parte del codice la puoi spostare all'interno del server InterBase.
In soldini questo si traduce nella richiesta, da parte di un client, di una certa operazione (passando eventualmente dei parametri a IB) e alla semplice visualizzazione del risultato.
Per quanto riguarda l'installazione, ci sono prodotti come InstallShield che permettono di realizzare il classico Setup della tua applicazione in poco tempo. IS supporta benissimo Delphi e InterBase.
Non puoi integrare il database di MySQL (o InterBase) nell'eseguibile dell'applicazione.
Traxsung
03-10-2005, 13:23
io non conosco InterBase.... quindi mi troverei completamente spiazzato... invece mi trovo più a mio agio con l'accoppiata Delphi+Mysql+SQL.
Per quanto riguarda InstallShield... esiste la possibilità di far installare prima Mysql e poi la mia applicazione??
cdimauro
04-10-2005, 11:10
io non conosco InterBase.... quindi mi troverei completamente spiazzato... invece mi trovo più a mio agio con l'accoppiata Delphi+Mysql+SQL.
Capisco che è una questione di abitudine, ma considera che Delphi ha un supporto completo a InterBase: collegarsi al db è roba di pochi minuti (secondi per chi ci è abituato :D), e utilizzare componenti che visualizzano edit, combobox, griglie, ecc. che prendono i valori dal database è una vera bazzecola. Si realizza in pochissimo tempo un'applicazione che accede a un DB InterBase, proprio grazie al fatto che Delphi ha già integrato parecchi componenti che fanno tutto il lavoro.
Secondo me è meglio spendere un'oretta guardando l'esempietto in dotazione a Delphi su come interfacciarsi a InterBase e come usarlo, piuttosto che utilizzare un altro server SQL perdendoci più tempo.
Poi fa tu, il mio è soltanto un consiglio, visto che ci sono già passato in mezzo... :)
Per quanto riguarda InstallShield... esiste la possibilità di far installare prima Mysql e poi la mia applicazione??
Sì, puoi fare quello che vuoi: basta configurarlo. Su questo, però, non ti posso aiutare: non l'ho mai fatto (per i miei programmi ho realizzato un installer apposito :p).
Traxsung
04-10-2005, 12:50
Potresti farmi vedere/avere un esempio usando InterBase?? Cmq io ho optato principalmente per Mysql+Sql perchè mi sono molto comodi i comandi Select ecc... In InterBase... esistono dei comandi simili??
cdimauro
05-10-2005, 12:17
Scherzi? InterBase DA ANNI offre un ambiente (quasi) SQL-92 compliant. :p
Anzi, MySQL soltanto da poco tempo ha introdotto l'integrità referenziale fra tabelle, e le transazioni. Cose più raffinate come i trigger e le stored procedure arriveranno soltanto la versione 5.0 di MySQL, e l'implementazione non sarà flessibile come quella già offerta (da tempo) da IB... ;)
Quanto all'esempio, ti invito a dare un'occhiata al demo IBXMastAppl (o qualcosa di simile: non ricordo bene il nome), che è molto ricco.
Comunque ti do delle dritte per realizzare in pochi minuti un'applicazione che s'interfaccia con un database InterBase. :)
1) Con IBConsole, che è un'applicazione fornita in dotazione con InterBase, collegati al server, effettua il login (all'inizio c'è solo l'utente "SYSDBA" con password "masterkey" che è l'account di amministratore: cambiagli subito la password subito dopo!), dopodiché dall'icona database col tasto destro seleziona create...
Si aprirà una finestra con la quale deciderai il nome del database (InterBase utilizza un solo file per memorizzare TUTTE le informazioni sulla sua struttura, sulle tabelle, sui dati, ecc.).
Ti consiglio di utilizzare come estensione ".ib" e non ".gdb" (che è quella storicamente usata), perché con questa estensione Windows XP archivierà automaticamente il file nel system restore alla sua chiusura se avrà subito modifiche, e quindi con un degrado delle prestazioni di InterBase. ".ib" è l'estensione suggirita da Borland e che ti consiglio di usare.
Dopo aver creato il database, che risulterà aperto, cliccando col tasto destro sul pannello (vuoto inizialmente) a destra, scegli la voce "create table..." (o giù di lì) e si aprirà un'altra finestra che ti permetterà di costruire la tua bella utilizzando l'interfaccia interamente a caratteri. Se hai esperienza con campi, tipo di dato, valori "not null", ecc. ti sarà molto facile capirne il funzionamento (è veramente molto intuitiva :)). Potrai definire anche la chiave primaria, eventuali indici, vincoli di integrità referenziale e vincoli calcolati in maniera molto semplice.
Chiaramente questo dipende strettamente dall'infarinatura "di base" che hai coi database. :)
Capitolo creazione database chiuso: passiamo al Data Module.
2) Una volta creato il database, passiamo a Delphi. Ti consiglio di crea un nuovo "Data module" nella tua applicazione, dove "centralizzerai" i componenti per l'accesso ai dati. Questo lo fai dal menù File/ New / Other... e clickando sull'apposita iconcina.
A questo punto puoi utilizzare i componenti "nativi" di InterBase che Delphi mette a disposizione per collegarti subito al database. Esistono 2 tab dedicati a InterBase: uno per i componenti di amministrazione ("InterBase Admin": per creare utenti, effettuare backup, ecc. ecc.), e l'altro per collegarti a tabelle, query, stored procedure, ecc. ("InterBase Controls". Entrambi i nomi prendili con le pinze, perché non ho una buona memoria purtroppo... :p).
Cerca TIBDatabase e TIBTransaction, selezionali e trascinali nel form del DataModule. Quindi come proprietà del primo metti in DatabaseName il percorso completo del file del database; poi clicka su Params e troverai già la voce 'user_name=SYSDBA'; aggiungigli 'password=masterkey' (se non hai cambiato la password, ma fallo prima possibile!!!); poni LoginPrompt a False (il login lo farà automaticamente coi parametri appena passati ;)); poi in DefaultTransaction seleziona il componente TIBTransaction che fa compagnia a TIBDatabase.
A questo punto metti Connected a True nel componente TIBDatabase e Active a True in quello TIBTransaction, e il gioco è fatto: sei connesso al database, e hai anche la transazione già aperta... ;)
Capitolo Data Module chiuso: passiamo al form che userà l'utente per accedere ai dati. Da premettere che per tutti i form che vorranno accedere ai dati, dovrai PRIMA eseguire File / Use unit... e selezionare il Data Module appena creato, così potranno "vedere" e accedere ai componenti in esso contenuti.
3) Per accedere ai dati puoi utilizzare traquillamente i controlli standard che Delphi mette a disposizione (DBEdit, DBComboBox, ecc.).
Ti ricordo che tutti questi componenti hanno bisogno che nel campo DataSource sia selezionato un componente DataSource, che a sua volte è collegato al componente discendente da TDataSet che fornire i dati veri e propri. Ma andiamo con ordine. ;)
Mettiamo che tu voglia accedere a tutti i record di una tabella di InterBase. Il componente ideale in questo caso è TIBTable: lo prendi dal tab dei controlli di InterBase, e lo trascini sul form. Nei campi DataBase metti il componente TIBDataBase (ce n'è soltanto uno, "preso" dal Data Module: basta selezionarlo ;)) e in Transaction il TIBTransaction; poi in TableName scegli il nome della tabella a cui t'interessa accedere. A questo punto basta impostare Active a True, e i record della tabella verrano prelevati dal db. :)
Per visualizzarli, trascina un componente TDataSource sul form, come DataSet seleziona il componente TIBTable appena creato.
A questo punto basta trascinare un qualunque componente DB di Delphi: prendiamo il TDBGrid, che ci consente di visualizzare i record sotto forma di griglia, appunto. Basta selezionare come DataSource quello appena creato, impostare Active a True, e il gioco è fatto! :)
4) TIBTable è un componente comodo, ma anche dispendioso in termini di tempo e risorse occupate. Se t'interessa avere soltanto alcuni campi della tabella, o vuoi applicare un filtro ai dati, ti consiglio di usare la più flessibile TIBQuery. Con questa imposti la tua query nel campo SQL, e avrai pieno controllo di ciò che ti serve prelevare.
Se ti serve eseguire una query di tipo INSERT, DELETE o UPDATE, ti consiglio di usare il componente TIBSQL. Anche per questo imposti in SQL l'istruzione SQL, con l'accortezza di mettere i due punti ':' e un identificatore dove ti serve inserire un parametro, da passare poco prima dell'esecuzione della query.
Metti, ad esempio, che la query da eseguire sia questa: "INSERT INTO Anagrafica VALUES(:Nome, :Cognome, :Citta)". Quando dovrai eseguire la query da programma, farai qualcosa di simile a questo:
with SQLInsert do begin
ParamByName('Nome').AsString := 'Mario';
ParamByName('Cognome').AsString := 'Rossi';
ParamByName('Citta').AsString := 'Roma';
ExecQuery;
end;
Supponendo che SQLInsert sia il nome del componente TIBSQL. Il gioco è fatto. ;)
Attenzione: TIBSQL ti permette anche di prelevare dei record da una query, in maniera molto più veloce che con TIBQuery (che è un componente che torna dati a componenti visuali).
Esempio: SELECT COUNT(*) FROM Anagrafica è la query inserita in SQLCount di tipo TIBSQL. Tornerà soltanto un valore, che potrai prelevare semplicemente con:
var
NumRecords: Integer;
begin
with SQLCount do begin
ExecQuery;
NumRecords := Fields[0].AsInteger;
Close;
end;
end;
Se invece vuoi vedere come prelevare tutti i record da una query che ne può tornare più di uno, il codice è di poco diverso.
Mettiamo che sia query sia questa: SELECT ID FROM Anagrafica WHERE Citta = :Citta
with SQLIDRoma do begin
ParamByName('Citta').AsString := 'Roma';
ExecQuery;
while not EOF do begin
Writeln('ID = ', Fields[0].AsString);
Next;
end;
Close;
end;
Da notare l'uso del parametro Citta... ;)
OK, penso che proprio che ti possa bastare, eh! ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.