PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Connexion ODBC HANA
Connexion ODBC HANA
Débuté par ali, 08 jan. 2020 11:21 - 15 réponses
Membre enregistré
52 messages
Popularité : +1 (1 vote)
Posté le 08 janvier 2020 - 11:21
Bonjour;
Je veux créer une connexion ODBC pour se connecter à une base de données HANA comme mentioné dans le code ci-dessous, la connexion je l'ai déjà créé dans l'administrateur de sources de données ODBC, mais à l'exécution j'ai toujours un message d'erreur "source de données introuvalbe et nom du pilote non spécifié".

NomSource est une chaîne = "SAP_FORMATION"
NumConnexion est un entier


NumConnexion = SQLConnecte("10.10.10.5:30015","SYSTEM","Dimed_2013",NomSource,"ODBC",hODBC)
SI NumConnexion = 1 ALORS
Info("Connexion")
SINON
SQLInfoGene()
Info(SQL.MesErreur)
SQLDéconnecte()
FIN


J'avoue que je ne maitrise pas ODBC, j'avais l'habitude de travailler directement sur des bases HFSQL.

Merci.
Membre enregistré
352 messages
Popularité : +12 (18 votes)
Posté le 08 janvier 2020 - 11:30
Bonjour. Le paramètre 1 correspond au nom de la connexion, dans votre cas, SAP_FORMATION, le paramètre 4 doit être une chaine vide
Message modifié, 08 janvier 2020 - 11:34
Membre enregistré
52 messages
Popularité : +1 (1 vote)
Posté le 08 janvier 2020 - 13:19
Merci pour la réponse, ça a marché.

J'ai une autre question, comment manipuler ensuite les données via ODBC, sachant que j'ai créé la connexion dans l'analyse et elle fonctionne, mais je n'ai aucune table donc je sais pas comment faire appel aux table de HANA.

Dans l’environnement SAP ça je le maîtrise très bien (SQL).

Merci.
Membre enregistré
352 messages
Popularité : +12 (18 votes)
Posté le 08 janvier 2020 - 13:59
Du moment où vous utilisez la fonction SQLConnecte pour établir la connexion, il faut faire appel aux fonctions SQL pour manipuler les données, comme SQLExec, SQLPremier, SQLAvance, SQL.EnDehors, SQLSuivant, SQLFerme, SQLDeconnecte.

Si vous n'avez pas de table, que voulez vous faire ensuite?
Membre enregistré
52 messages
Popularité : +1 (1 vote)
Posté le 08 janvier 2020 - 14:34
Merci à vous pour vos réponse, c'est bon j'ai trouvé le fil qui me manquait, voici la solution à celui qui est intéréssé:

NumConnexion est un entier
i est un entier

//Connexion à une source de données spécifique via ODBC
NumConnexion = SQLConnecte("SAP_FORMATION","SYSTEM","mdp","","ODBC",hODBC)
SI NumConnexion<>0 ALORS
//La connexion s'est bien passée
//Utilisation de la connexion pour exécuter des requêtes SQL
SI PAS SQLExec ("SELECT * FROM SAP_FORMATION.OCRD","REQ_SELECT") ALORS
//Echec de la requête : Affichage d'un message explicatif
SQLInfoGene("REQ_SELECT")
Erreur("Erreur"+SQL.Erreur+" dans le requête:",SQL.MesErreur)
SQLFerme("REQ_SELECT")
SINON
Info("Exécuté")


TANTQUE SQLAvance("REQ_SELECT") = 0 // Il y a encore une ligne à lire
// info(SQLLitCol("REQ_SELECT",1))
TableAjouteLigne(TABLE_SansNom1,(SQLLitCol("REQ_SELECT",1)),(SQLLitCol("REQ_SELECT",2)))
FIN
SQLFerme("REQ_SELECT")

FIN
SINON
//La connexion a échoué: affichage d'un message explicatif
SQLInfoGene()
Erreur("Erreur de connexion"+"SAP_FORMATION" +RC+SQL.Erreur+RC+SQL.MesErreur)
SQLTransaction(sqlAnnule)
FIN

SQLDéconnecte()


Sujet clôturé
Membre enregistré
52 messages
Popularité : +1 (1 vote)
Posté le 09 janvier 2020 - 10:13
Bonjour;

Il semble qu'il me reste une autre petite question:

> SQLExec ("SELECT * FROM SAP_FORMATION.OCRD","REQ_SELECT")
Quand j'exécute la requête , ça marche car j'ai fait SELECT *, sans spécifier le nom du champ, mais quand je fait une condition genre WHERE OCRD.CardCode='Code01', là je trouve un problème, avec un message OCRD.CODE01 n'est pas trouvé dans la table OCRD, c'est à dire dans la requete tout est remis en majuscule, or, dans mon cas les champs des tables sont sensibles à la casse, donc je sais pas comment je pourrai contourner ça.

Merci.
Membre enregistré
52 messages
Popularité : +1 (1 vote)
Posté le 13 janvier 2020 - 09:35
Bonjour;

Je suis toujours coincé dans ce problème de casse, c'il y a quelqu'un pour m'aider.
Membre enregistré
352 messages
Popularité : +12 (18 votes)
Posté le 13 janvier 2020 - 10:18
Bonjour.
Je ne comprends pas votre erreur, en mettant "WHERE OCRD.CardCode='Code01", pourquoi est-ce que la colonne "OCRD.CODE01" est utilisée?
Par contre, c'est assez dangereux de faire un SELECT * avec les fonctions SQL, par il n'est pas possible de faire appel à des noms de colonne, il est juste possible de faire appel à des indices de colonnes.
Si vous faites "WHERE CardCode='Code01", est-ce que la requête fonctionne?
Membre enregistré
52 messages
Popularité : +1 (1 vote)
Posté le 13 janvier 2020 - 10:53
Bonjour,
Je te remercie pour la réponse.

>>Si vous faites "WHERE CardCode='Code01", est-ce que la requête fonctionne?

Le problème réside dans le nom du champ CardCode, windev remet tout en majuscule CARDCODE, et HANA (SGBD de SAP), est sensible à la casse, donc il ne reconnait pas le champ, et il renvoie une erreur comme quoi le champ n'est pas trouvé.

c'est assez dangereux de faire un SELECT * avec les fonctions SQL


Le SELECT * je l'ai fait pour tester l'accès aux données, et là ça marche car je n'ai pas précisé le nom du champ.
Message modifié, 13 janvier 2020 - 10:53
Membre enregistré
352 messages
Popularité : +12 (18 votes)
Posté le 13 janvier 2020 - 17:59
Bonjour.
Essayez avec WHERE CARDCODE='Code01'
Membre enregistré
52 messages
Popularité : +1 (1 vote)
Posté le 14 janvier 2020 - 09:24
ROMULUS001 a écrit :
Bonjour.
Essayez avec WHERE CARDCODE='Code01'


ça ne marche pas, je l'ai déjà fait,et le problème ne réside pas dans la condition seulement, même dans la sélection des champs.
Membre enregistré
18 messages
Popularité : +1 (1 vote)
Posté le 14 janvier 2020 - 13:10
Bonjour,

il te faut protéger le nom de ton champ.
SELECT
OSLP."Active",
OSLP."SlpName",
OSLP."Memo",
OSLP."Mobil",
OSLP."Email",
OSLP."SlpCode"
FROM
"[%SansEspace(comAgence.colAgBase)%]"."OSLP" AS OSLP
ORDER BY OSLP."SlpName"


Tu peux aussi utiliser les fonctions hxxx au lieu de sqlxxxx
HExécuteRequêteSQL(sdReqODBC,vpcCxionODBC:cxCxion,hRequêteSansCorrection,SansEspace(sCondition))
POUR TOUT sdReqODBC
// Traitement
FIN


Bon courage et bon dev.
Membre enregistré
52 messages
Popularité : +1 (1 vote)
Posté le 14 janvier 2020 - 16:03
EJ a écrit :
Bonjour,

il te faut protéger le nom de ton champ.
SELECT
OSLP."Active",
OSLP."SlpName",
OSLP."Memo",
OSLP."Mobil",
OSLP."Email",
OSLP."SlpCode"
FROM
"[%SansEspace(comAgence.colAgBase)%]"."OSLP"AS OSLP
ORDER BY OSLP."SlpName"


Tu peux aussi utiliser les fonctions hxxx au lieu de sqlxxxx
HExécuteRequêteSQL(sdReqODBC,vpcCxionODBC:cxCxion,hRequêteSansCorrection,SansEspace(sCondition))
POUR TOUT sdReqODBC
// Traitement
FIN


Bon courage et bon dev.


Merci pour la réponse, en fait il mettre le champ de table entre deux paires de guillemets pour fontionner >OSLP.""Active""

avec

>OSLP."Active"

ça ne fonctionne pas.

Maintenant je veux ajouter un paramètre de sélection à la requête.
Membre enregistré
352 messages
Popularité : +12 (18 votes)
Posté le 15 janvier 2020 - 09:40
ali a écrit :
> ça ne marche pas, je l'ai déjà fait,et le problème ne réside pas dans la condition seulement, même dans la sélection des champs.

Si vous avez Excel, ouvrez le, dans l'onglet "données", en ouvrant la pop-up du bouton "obtenir des données", faites "à partir d'autres sources", puis, "à partir d'ODBC".
En faisant cela, vous allez pouvoir tester votre ODBC, et ainsi récupérer les données des colonnes des tables que vous voulez utilisez, il me semble qu'il est aussi possible de récupérer une requête Select dans excel, mais je ne peux pas confirmer.
Si ça peut vous aider.
Membre enregistré
52 messages
Popularité : +1 (1 vote)
Posté le 15 janvier 2020 - 11:04
ROMULUS001 a écrit :
ali a écrit :
ça ne marche pas, je l'ai déjà fait,et le problème ne réside pas dans la condition seulement, même dans la sélection des champs.

Si vous avez Excel, ouvrez le, dans l'onglet "données", en ouvrant la pop-up du bouton "obtenir des données", faites "à partir d'autres sources", puis, "à partir d'ODBC".
En faisant cela, vous allez pouvoir tester votre ODBC, et ainsi récupérer les données des colonnes des tables que vous voulez utilisez, il me semble qu'il est aussi possible de récupérer une requête Select dans excel, mais je ne peux pas confirmer.
Si ça peut vous aider.


Merci beaucoup pour les réponses données.
En fait, moi je veux faire cela sur une application windev pour plusieurs raison, je vais tester ça car c'est intéressant aussi sur Excel, mais je continuerai à rechercher sur windev, je vous publie la solution une fois trouvée.
Membre enregistré
18 messages
Popularité : +1 (1 vote)
Posté le 17 janvier 2020 - 13:44
Ali,

Fait un test simple:
* Configuration de la connexion directement dans l'analyse de ton projet en utilisant bien ton lien ODBC
* Tu codes ta requête et ta lecture:
sCondition est une chaîne
sdReqODBC est une Source dede Données

sCondition = [
SELECT
OSLP."Active",
OSLP."SlpName",
OSLP."Memo",
OSLP."Mobil",
OSLP."Email",
OSLP."SlpCode"
FROM
"NOM DE TA BASE HANA"."OSLP" AS OSLP
ORDER BY OSLP."SlpName"
]

HExécuteRequêteSQL(sdReqODBC,hRequêteSansCorrection,SansEspace(sCondition))
POUR TOUT sdReqODBC
Info(sdReqODBC.slpName)
FIN

Tu devrais avoir la liste des représentants.

Bon courage et bon dev.