PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 2024 → [ORA-OLEDB] HCréation ne crée pas toutes les tables
[ORA-OLEDB] HCréation ne crée pas toutes les tables
Iniciado por a.germain, jun., 21 2005 8:44 PM - 6 respostas
Publicado em junho, 21 2005 - 8:44 PM
Bonjour à tous,
Je souhaite connecter mon appli à une base Oracle via OLEDB (oraOLEDB.Oracle).

Pour ce faire, j'utilise HChangeConnexion, et ensuite HCreationSiInexistant("*") pour créer toutes les tables décrites dans l'analyse.

=> Bien que HCréation ne renvoie pas d'erreur, 4 tables ne sont pas créées, et je ne voie pas d'explication. Toutes les autres sont créées correctement.

Afin de voir un peu plus en détails, j'ai abandonné le paramètre "*" de HCréationSiInexistant, pour parcourir la liste des fichiers et les créer 1 par 1. Pareil : tout fonctionne, sauf pour 4 tables.

J'ai ensuite voulu faire moi même le test de l'existance de chaque table, c'est le code qui suit. Idem : 4 de mes tables ne sont pas crées.


i est un entier
chReq,table sont des chaines

ListFic est une chaine = HListeFichier()
POUR i=1 A ChaîneOccurrence(ListFic,RC)

table=ExtraitChaîne(ListFic, i, RC) //nom de la table

//requête sur la liste des tables de la base
chReq ="SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME='"+Majuscule(table)+"'"
SI PAS HExécuteRequêteSQL("ReqSelTable",chReq) ALORS
Erreur(HErreurInfo(hErrComplet))
FIN
HLitPremier("ReqSelTable")
SI HEnDehors("ReqSelTable") ALORS //la table n'existe pas
SI PAS HCréation(table) ALORS //création de la table => renvoie tjs vrai !
Erreur(HErreurInfo(hErrComplet))
FIN
FIN
HAnnuleDéclaration("ReqSelTable")

//On Vérifie que la nouvelle table apparait dans la liste des tables
SI PAS HExécuteRequêteSQL("ReqSelTable",chReq) ALORS
Erreur(HErreurInfo(hErrComplet))
FIN
HLitPremier("ReqSelTable")
SI HEnDehors("ReqSelTable") ALORS
Erreur("La création de "+table+" a échouée") //erreur sur mes 4 tables "problématiques"
FIN

FIN


Pour info, les tables "problématiques" contiennent des colonnes de type date, numérique et texte, rien de bien particulier par rapport aux autres tables qui n'ont pas posé de problèmes.

Si quelqu'un a la moindre suggestion, je le remercie d'avance.

Cordialement,
Arnaud
Publicado em junho, 22 2005 - 11:07 AM
Bonjour,

Il est possible que vos tables portent un nom physique identique à d'autres
tables. Vérifiez que le nom physique (Nom de la table dans la base de
données externe) décrit dans l'éditeur d'analyse ne correspond pas au nom d'une
autre table. Cette information est disponible dans la fenêtre de description
des fichiers.



--
Ed en Ligne

"Arnaud" <a.germain@diags.fr> a écrit dans le message de news:
42b8394b$1@news.pcsoft.fr...
Bonjour à tous,
Je souhaite connecter mon appli à une base Oracle via OLEDB
(oraOLEDB.Oracle).

Pour ce faire, j'utilise HChangeConnexion, et ensuite
HCreationSiInexistant("*") pour créer toutes les tables décrites dans
l'analyse.

=> Bien que HCréation ne renvoie pas d'erreur, 4 tables ne sont pas
créées, et je ne voie pas d'explication. Toutes les autres sont créées
correctement.

Afin de voir un peu plus en détails, j'ai abandonné le paramètre "*" de
HCréationSiInexistant, pour parcourir la liste des fichiers et les créer 1
par 1. Pareil : tout fonctionne, sauf pour 4 tables.

J'ai ensuite voulu faire moi même le test de l'existance de chaque table,
c'est le code qui suit. Idem : 4 de mes tables ne sont pas crées.


i est un entier
chReq,table sont des chaines

ListFic est une chaine = HListeFichier()
POUR i=1 A ChaîneOccurrence(ListFic,RC)

table=ExtraitChaîne(ListFic, i, RC) //nom de la table

//requête sur la liste des tables de la base
chReq ="SELECT TABLE_NAME FROM USER_TABLES WHERE
TABLE_NAME='"+Majuscule(table)+"'"
SI PAS HExécuteRequêteSQL("ReqSelTable",chReq) ALORS
Erreur(HErreurInfo(hErrComplet))
FIN
HLitPremier("ReqSelTable")
SI HEnDehors("ReqSelTable") ALORS //la table n'existe pas
SI PAS HCréation(table) ALORS //création de la table => renvoie
tjs vrai !
Erreur(HErreurInfo(hErrComplet))
FIN
FIN
HAnnuleDéclaration("ReqSelTable")

//On Vérifie que la nouvelle table apparait dans la liste des tables
SI PAS HExécuteRequêteSQL("ReqSelTable",chReq) ALORS
Erreur(HErreurInfo(hErrComplet))
FIN
HLitPremier("ReqSelTable")
SI HEnDehors("ReqSelTable") ALORS
Erreur("La création de "+table+" a échouée") //erreur sur mes 4
tables "problématiques"
FIN

FIN


Pour info, les tables "problématiques" contiennent des colonnes de type
date, numérique et texte, rien de bien particulier par rapport aux autres
tables qui n'ont pas posé de problèmes.

Si quelqu'un a la moindre suggestion, je le remercie d'avance.

Cordialement,
Arnaud
Publicado em junho, 22 2005 - 12:17 PM
Bonjour, et merci pour votre réponse.

Avant de faire HCréation(table), je commence par vérifier si la table existe déjà, en sélectionnant, parmi la liste de toutes les tables de la base externe, une éventuelle table qui porte le même nom :

//requête sur la liste des tables de la base
chReq ="SELECT TABLE_NAME FROM USER_TABLES WHERE
TABLE_NAME='"+Majuscule(table)+"'"
SI PAS HExécuteRequêteSQL("ReqSelTable",chReq) ALORS
Erreur(HErreurInfo(hErrComplet))
FIN
HLitPremier("ReqSelTable")

C'est seulement si cette requête ne renvoie pas de résultat que je fais HCréation(table) :

SI HEnDehors("ReqSelTable") ALORS //la table n'existe pas
SI PAS HCréation(table) ALORS //création de la table => renvoie tjs vrai !
Erreur(HErreurInfo(hErrComplet))
SINON
Info("HCréation("+table+") ","n'a pas renvoyé d'erreur.")
FIN
FIN
HAnnuleDéclaration("ReqSelTable")


Suite à votre suggestion, j'ai de plus vérifier manuellement qu'il n'y avait pas, dans la base externe, de tables portant le nom des tables à créer. Il n'y en a pas.

=> En fait, je pense qu'il n'y a pas de problème pour la détection de l'existance de la table. Mais c'est bien la création de la table qui ne se fait pas avec HCréation (mais renvoie quand même vrai !).

J'espère que quelqu'un aura une autre idée.
Arnaud
Publicado em junho, 22 2005 - 12:49 PM
Bonjour,

Dans l'éditeur d'analyse, pour chaque fichier décrit avec un nom logique, il
est possible de lui donner un nom physique différent. Par exemple : le
fichier client à un nom physique : CLIENT_SQL et le fichier Fournisseur à un
nom physique : CLIENT_SQL. Ce nom donné par erreur aura pour conséquence que
la commande HCreation(Fournisseur) ne fera rien car HCréation(client) a déjà
créé CLIENT_SQL.



Dans votre cas, vous devez vérifier que le nom physique(pas le nom logique)
décrit dans l'analyse n'existe pas pour un autre fichier.


--
Ed en Ligne


"Arnaud" <a.germain@diags.fr> a écrit dans le message de news:
42b91418$1@news.pcsoft.fr...

Bonjour, et merci pour votre réponse.

Avant de faire HCréation(table), je commence par vérifier si la table
existe déjà, en sélectionnant, parmi la liste de toutes les tables de la
base externe, une éventuelle table qui porte le même nom :

//requête sur la liste des tables de la base
chReq ="SELECT TABLE_NAME FROM USER_TABLES WHERE
TABLE_NAME='"+Majuscule(table)+"'"
SI PAS HExécuteRequêteSQL("ReqSelTable",chReq) ALORS
Erreur(HErreurInfo(hErrComplet))
FIN
HLitPremier("ReqSelTable")

C'est seulement si cette requête ne renvoie pas de résultat que je fais
HCréation(table) :

SI HEnDehors("ReqSelTable") ALORS //la table n'existe pas
SI PAS HCréation(table) ALORS //création de la table => renvoie tjs vrai !
Erreur(HErreurInfo(hErrComplet))
SINON
Info("HCréation("+table+") ","n'a pas renvoyé d'erreur.")
FIN
FIN
HAnnuleDéclaration("ReqSelTable")


Suite à votre suggestion, j'ai de plus vérifier manuellement qu'il n'y
avait pas, dans la base externe, de tables portant le nom des tables à
créer. Il n'y en a pas.

=> En fait, je pense qu'il n'y a pas de problème pour la détection de
l'existance de la table. Mais c'est bien la création de la table qui ne se
fait pas avec HCréation (mais renvoie quand même vrai !).

J'espère que quelqu'un aura une autre idée.
Arnaud
Publicado em junho, 22 2005 - 1:03 PM
Vérifiez le nom des colonnes des tables en question, ces noms pourrait correspondre a des nom systemes d'oracle du genre todate ou autre
Publicado em junho, 22 2005 - 2:12 PM
Merci pour ces précisions.
Toutefois, pour une base Oracle, il ne me semble pas qu'il y ait cette distinction nom physique / nom logique. En effet, il ne s'agit alors pas de fichiers, mais bien de tables. La fonction HCréation(nomLogiqueTable) est, je pense, une simple requête "CREATE TABLE nomLogiqueTable ...;".

Suite à votre message précédent, j'avais tout de même vérifier l'unicité des noms physiques des fichiers de l'analyse. Je vous remercie car c'est grâce à votre suggestion que j'ai trouvé un moyen de contourner (mais pas de comprendre) le problème :

=> J'ai renommé les tables problématiques (noms logiques), généré l'analyse, puis j'ai remis les noms initiaux et regénéré l'analyse, et depuis, HCréation fonctionne aussi sur ces tables. Cependant, je n'ai pas d'explication.

Merci encore

Arnaud
Publicado em junho, 22 2005 - 2:18 PM
Merci pour votre suggestion, j'ai vérifié les noms des colonnes, il n'y a pas de "mot-clé" Oracle. En fait, en utilisant des requêtes SQL de création de table tout fonctionne : CREATE TABLE... mais à la moindre modification de l'analyse, il faut reécrire les requètes !


J'ai cependant réussi à contourner (mais pas à comprendre) le problème :

=> J'ai renommé les tables problématiques, généré l'analyse, puis j'ai remis les noms initiaux et regénéré l'analyse, et depuis, HCréation fonctionne aussi sur ces tables. Cependant, je n'ai pas d'explication !

Arnaud