Si vous avez des difficultés à retourner les valeurs des colonnes Oracle de type date avec 4D for OCI, essayez d’utiliser ces fonctions spécifiques :
OCIDefineDateByPos
OCIBindDateByName
OCIBindDateByPos
http://www.4d.com/docs/4dforoci/4doci.html
Si le champs de type date de 4D ne contient que la date, celui d’Oracle stocke aussi l’heure. C’est pourquoi il faut utiliser SQLT_ODT et passer deux pointeurs au lieu d'un seul : celui pour la date et celui pour le temps, même si ce dernier n'est pas utilisé.
Exemple de code avec
OCIDefineDateByPos :
` ---------- exemple ----------
TABLEAU DATE(results_date;3)
`tableau date pour le premier pointeur
TABLEAU ENTIER LONG(results_time;3)
`tableau heure pour le second pointeur
TABLEAU ENTIER LONG($tNull;1)
TABLEAU ENTIER LONG($tTailles;1)
TABLEAU ENTIER LONG($tCodes;1)
$tTailles{1}:=255
$UserName:="xxx"
$Password:="xxx"
$OraServ:="xxx"
$sql:="SELECT date_fact FROM factures"
$Status:=
OCIEnvCreate ($DescrEnv;
OCI_DEFAULT)
$Status:=
OCIHandleAlloc ($DescrEnv;$DescrErr;
OCI_HTYPE_ERROR)
$Status:=
OCIHandleAlloc ($DescrEnv;$DescrService;
OCI_HTYPE_SVCCTX)
$Status:=
OCIHandleAlloc ($DescrEnv;$DescrAuth;
OCI_HTYPE_SESSION)
$Status:=
OCIHandleAlloc ($DescrEnv;$DescrServer;
OCI_HTYPE_SERVER)
$Status:=
OCIServerAttach ($DescrServer;$DescrErr;$OraServ)
$Status:=
OCIAttrSetVal ($DescrService;$DescrServer;
OCI_ATTR_SERVER;$DescrErr)
$Status:=
OCIAttrSetText ($DescrAuth;$UserName;
OCI_ATTR_USERNAME;$DescrErr)
$Status:=
OCIAttrSetText ($DescrAuth;$Password;
OCI_ATTR_PASSWORD;$DescrErr)
$Status:=
OCISessionBegin ($DescrService;$DescrErr;$DescrAuth;
OCI_CRED_RDBMS;
OCI_DEFAULT)
$Status:=
OCIAttrSetVal ($DescrService;$DescrAuth;
OCI_ATTR_SESSION;$DescrErr)
$Status:=
OCIHandleAlloc ($DescrEnv;$DescrStmt;
OCI_HTYPE_STMT)
$Status:=
OCIStmtPrepare ($DescrStmt;$DescrErr;$sql;Length($sql))
$sqlt:=
SQLT_ODT
$Status:=
OCIDefineDateByPos ($DescrStmt;$DescrDefine;$DescrErr;1;
->results_date;->results_time;$sqlt;->$tNull;->$tTailles;->$tCodes;
OCI_DEFAULT)
$Status:=
OCIStmtExecute ($DescrService;$DescrStmt;$DescrErr;0;0;0;0;
OCI_DEFAULT)
$Status:=
OCIStmtFetch ($DescrStmt;$DescrErr;10)
$text:=
Chaine(results_date{1})+
Caractere(13)
Boucle ($i;2;
Taille tableau(results_date))
$text:=$text+
Chaine(results_date{$i})+
Caractere(13)
Fin de boucle
ALERTE("TABLEAU DATE :"+
Caractere(13)+$text)
$Status:=
OCISessionEnd ($DescrService;$DescrErr;$DescrAuth)
$Status:=
OCIServerDetach ($DescrServer;$DescrErr)
$Status:=
OCIHandleFree ($DescrService)
$Status:=
OCIHandleFree ($DescrServer)
$Status:=
OCIHandleFree ($DescrErr)
$Status:=
OCIHandleFree ($DescrEnv)
TABLEAU DATE(results_date;0)
TABLEAU DATE(results_time;0)
` ---------- fin exemple ----------
En complément, petit script SQL pour créer la table factures :