Gli ID autoincrementali sono tra i campi più utilizzati come chiavi primarie nelle tabelle dei database relazionali; hanno il pregio di essere compatti, facili da leggere e generati dal database, quindi automaticamente univoci.
PowerBuilder offre un ottimo supporto agli ID autoincrementali all’interno delle datawindow e dei datastore. Basta infatti specificare, nella schermata Update Properties del DataWindow Painter, qual è la Identity Column della tabella perchè PB si occupi – dopo una INSERT – di recuperare il valore generato dal database e inserirlo nel corrispondente campo della datawindow o del datastore.
Ad esempio, supponiamo di avere una tabella clienti
con campi id
e ragione_sociale
; se creiamo una datawindow d_clienti
con entrambi i campi e selezioniamo il campo id
come Identity Column nella datawindow, possiamo scrivere il seguente codice:
datastore lds_clienti
lds_clienti = create datastore
lds_clienti.DataObject = 'd_clienti'
lds_clienti.SetTransObject(sqlca)
lds_clienti.InsertRow(0)
lds_clienti.SetItem(1, 'ragione_sociale', 'Appeon User Group Italiano')
lds_clienti.Update()
MessageBox('Cliente creato', 'ID assegnato: ' + &
String(lds_clienti.GetItemNumber(1, 'id')))
La chiamata alla funzione MessageBox ci mostrerà l’ID che è stato assegnato al nuovo record.
Per fare ciò PowerBuilder – dopo la INSERT – esegue, dietro le quinte, una query sul database per farsi restituire l’ultimo identificatore creato. I diversi DBMS gestiscono in modo non uniforme questa funzionalità: come spesso capita, ognuno ha la sua sintassi “custom”.
PowerBuilder & MySQL: un amore mai sbocciato
PowerBuilder supporta decine di DBMS ma, per motivi che mi sfuggono, non ha mai supportato ufficialmente MySQL. Una spiegazione è che PB si è sempre rivolto allo sviluppo di applicazioni Client/Server; MySQL è stato storicamente poco usato in questo contesto – mentre è sicuramente leader nelle applicazioni e nei siti web. Anche Appeon, fino ad oggi, ha scelto di non supportare questo DBMS preferendogli, tra le soluzioni open-source, PostgreSQL.
Se ci si avventura, quindi, nell’integrazione tra PB e MySQL (o del suo derivato MariaDB) si devono affrontare diversi ostacoli e scoprire, a prezzo di nottate insonni, i corretti parametri di configurazione che consentono di farlo funzionare. Il connettore d’elezione è a tutt’oggi il caro vecchio ODBC, per il quale MySQL offre un driver originale sviluppato direttamente dal produttore (che lavora molto bene anche con MariaDB).
Far funzionare gli ID autoincrementali con PB
Per quanto riguarda gli ID autoincrementali, con MySQL questi non funzionano correttamente se non si provvede a configurare manualmente il file PBODBxxx.INI (semplicemente PBODB.INI dalla versione 2019 in poi). Questo perchè tale file di configurazione, che contiene una sorta di “mapping” tra le operazioni utili in PowerBuilder e le corrispondenti sintassi del DBMS, non contiene una sezione dedicata a MySQL. Pertanto PB applica le query predefinite che però non è detto funzionino con MySQL.
Per permettere a PB di gestire correttamente gli ID AUTO_INCREMENT basta aggiungere al file PBODBxxx.INI le seguenti righe:
[MySQL]
PBSyntax='MySQL_SYNTAX'
[MySQL_SYNTAX]
GetIdentity='select @@identity'
L’istruzione SQL select @@identity
è infatti la query di MySQL per ottenere l’ultimo ID generato dal database.
E’ importante, ovviamente, che il file PBODBxxx.INI modificato sia rilasciato al cliente che utilizza MySQL all’interno della cartella contenente l’applicazione o ad una cartella nell’App Path dell’applicazione stessa. Sulle macchine di sviluppo è possibile che siano presenti più copie di questo file: è importante aggiornarle tutte per essere sicuri che tutto funzioni.
Stay tuned: sto ancora lavorando per ottenere piena compatibilità tra PowerBuilder e MySQL, per cui potremmo pubblicare altri articoli sull’argomento su questo blog!