Talvolta, avendo a che fare con ODBC e l’sql, farebbe comodo estrarre i dati di un campo facendo riferimento al suo nome, e non alla sua posizione (1, 2, 3, etc…).
Purtroppo, fin troppo spesso i linguaggi non offrono, di base, questa funzionalita`. Fortunatamente e` una funzione facilmente implementabile. Ecco come:
;==============================================================================
; @SYNTAX (get-field-id argFieldName )
; argFieldName: name of the field. It is case-sensitive.
;
; @RETURN the position of the field in the record.
;
; @EXAMPLE
; > (ODBC:query "...")
; > (setq result (ODBC:fetch-row) )
; > (println (string (result (get-field-id "BARCODE_IP") ) ) )
; "1.2.3.4" ^^^^^^^^^^^^^^^^^^^^^
;
; @NOTE
; Database should be open, with the record already fetched.
;==============================================================================
(define (get-field-id argFieldName ,
locColDescription ; Description of the columns of the current record.
)
(setq locColDescription (map ODBC:column-atts (sequence 1 (ODBC:num-cols))) )
(index
(fn (x)
(= (string (x 0)) argFieldName )
);fn
locColDescription
);index
);define
O piu` brevemente (ma forse un po` meno leggibile…):
(define (get-field-id argFieldName , locColDescription) ; Description of the columns of the current record.
(setq locColDescription (map ODBC:column-atts (sequence 1 (ODBC:num-cols))) )
(index (fn(x)(= (string (x 0)) argFieldName ) );fn
locColDescription );index
);define
Come si usa? E` molto semplice. Prima di tutto aprite una connessione ODBC valida, usando ODBC:connect.
Poi preparare ed eseguite la vostra query select con ODBC:query. Infine estraete un record con ODBC:fetch-row.
A questo punto, per estrarre i dati del record appena letto, usate la precedente funzione get-field-id. Questa funzione altro non fa` che ricercare la posizione del campo di cui si e` chiesto il dato (il nome del campo lo dovrete passare come argomento alla funzione stessa).
Ecco un esempio (illustrato anche nell’intestazione della funzione stessa):
> (ODBC:query "...") > (setq result (ODBC:fetch-row) ) > (println (string (result (get-field-id "BARCODE_IP") ) ) ) "1.2.3.4"
La funzione (get-field-id “BARCODE_IP”) ci restituisce la posizione del campo BARCODE_IP. Tale valore e` usato per estrarre il campo n-esimo di result, la quale contiene la lista di dati del record estratto.
Spero possa esservi d’aiuto (io la uso quotidianamente!).
Una ultima nota: trovo meraviglioso poter risolvere un problema come questo senza ricorrere a dei cicli (esempio usando il FOR) come invece si farebbe in molti altri linguaggi di programmazione. newLISP e` semplice, pulito, espressivo.
A presto!
Translate To English!
Commenti Recenti