Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Bonjour à tous,
J'ai 2 fichiers excel, possédant tous les mêmes champs.
2013.xlsx : 2014.xlsx
ID NOM ID NOM
1 a
2 b 2 bb
3 c 3 c
4 d
En 2014, l'ID 1 a disparu, l'ID 2 a été renommé, et l'ID 4 a été créé.
Je souhaite monter les 2 fichiers excel suivant les règles suivantes :
1 - le fichier 2014 est monté en premier (c'est le fichier qui évolue quotidiennement) ;
2 - le fichier 2013 est monté ensuite (c'est une archive, il peut y en avoir plusieurs) ;
3 - l'ID 1 de 2013 n'existe pas dans 2014, il faut le monter avec son nom ;
4 - l'ID 2 a été renommé, comme cette ID existe déjà dans 2014 il ne faut pas traiter celui de 2013 (et donc conserver uniquement le nom de 2014) ;
5 - l'ID 3 n'a pas évoluer, ne pas traiter (mais le conserver) ;
6 - l'ID 4 est nouveau, il doit rester.
La table que je souhaite obtenir est la suivante :
ID NOM
1 a
2 bb
3 c
4 d
Je ne parviens pas à obtenir de bons résultats avec les jointures, l'instruction keep, ou même une concaténation. Je ne parviens pas non plus à créer une requête avec des conditions sur 2 tables différentes (utilisation de resident, qualify...). Il doit bien y avoir une astuce relativement simple, mais je ne la vois pas.
Merci d'avance,
QF
The not exists isn't going to work with a resident load. Notice that I used it directly when loading from Excel. If you feel the need to use a resident load, the code is longer:
onglet XL13
Directory;
NoConcatenate
XL13:
LOAD ID,
NOM
FROM
Split_BDD_2013.xlsx
(ooxml, embedded labels, table is BDD_2013);
onglet XL12
Directory;
NoConcatenate
XL12:
LOAD ID as ID2,
NOM
FROM
Split_BDD_2012.xlsx
(ooxml, embedded labels, table is BDD_2012);
onglet XL
NoConcatenate
tout_xl:
LOAD ID, NOM Resident XL13;
Concatenate(tout_xl)
LOAD ID2 as ID, NOM Resident XL12 Where not Exists(ID,ID2);
DROP Tables XL13, XL12;
Data:
LOAD ID,
NOM
FROM 2014.xlsx (ooxml, embedded labels, table is Sheet1);
Concatenate(Data)
LOAD ID,
NOM
FROM 2013.xlsx (ooxml, embedded labels, table is Sheet1)
WHERE not exists(ID);
Merci beaucoup !
Je pensais que Where était réservé au SQL...
À présent je souhaite aller un peu plus loin :
Dans le script j'ai 3 onglets
onglet XL13
Directory;
NoConcatenate
XL13:
LOAD ID,
NOM
FROM
Split_BDD_2013.xlsx
(ooxml, embedded labels, table is BDD_2013);
onglet XL12
Directory;
NoConcatenate
XL12:
LOAD ID,
NOM
FROM
Split_BDD_2012.xlsx
(ooxml, embedded labels, table is BDD_2012);
onglet XL
NoConcatenate
tout_xl:
LOAD ID, NOM Resident XL13;
Concatenate(tout_xl)
LOAD ID, NOM Resident XL12 Where not Exists(ID);
DROP Tables XL13, XL12;
J'obtiens comme résultat
Je ne comprends pas pourquoi.
Désolé, je ne sais pas comment envoyer des fichiers
onglet XL13
Directory;
NoConcatenate
tout_xl:
LOAD ID,
NOM
FROM
Split_BDD_2013.xlsx
(ooxml, embedded labels, table is BDD_2013);
onglet XL12
Directory;
Concatenate(tout_xl)
LOAD ID,
NOM
FROM
Split_BDD_2012.xlsx
(ooxml, embedded labels, table is BDD_2012)
WHERE not exists(ID);
Je vais essayer de mettre ça en œuvre mais je ne suis pas très optimiste... Je vous tiens au courant.
C'est bien ce que je craignais : lorsqu'il y a des jointures ça ne marche plus. Avec les fichiers excel c'était simple, mais en pratique, j'ai besoin de monter mes tables 2013 en faisant de nombreuses jointures, idem pour les tables 2012. Si je fais des concaténations directement, il les fait alors que toutes les jointures ne sont pas réalisées, et de plus il renomme mes tables. J'ai donc des tables incomplètes, renommées, et des clefs sybthétiques en pagailles.
C'est pour ça que je souhaite monter table_2013, puis table_2012, et enfin faire
table_total:
load * resident table_2013;
load * resident table_2012 where not exists (ID_ACTIVITE);
(onglet 13)
ODBC CONNECT TO [MS Access Database;DBQ=C:\Users\fong\Desktop\TBS\Casset_2013_type_modifié.mdb];
//-------- Start Multiple Select Statements ------
effectue:
LOAD `ID_TACHE`,
`NB_HEURES`;
SQL SELECT `ID_TACHE`,
`NB_HEURES`
FROM Effectue;
activité:
LOAD `ID_ACTIVITE`,
`ID_TACHE`;
SQL SELECT `ID_ACTIVITE`,
`ID_TACHE`
FROM Tache;
Join(activité)
LOAD `ID_ACTIVITE`,
LIBELLE;
SQL SELECT `ID_ACTIVITE`,
LIBELLE
FROM `Type activite`;
//-------- End Multiple Select Statements ------
(onglet 12)
ODBC CONNECT TO [MS Access Database;DBQ=C:\Users\fong\Desktop\TBS\Casset_2012.mdb];
//-------- Start Multiple Select Statements ------
Concatenate(effectue)
LOAD `ID_TACHE`,
`NB_HEURES`
Where not Exists (ID_TACHE);
SQL SELECT `ID_TACHE`,
`NB_HEURES`
FROM Effectue;
activité:
LOAD `ID_ACTIVITE`,
`ID_TACHE`;
SQL SELECT `ID_ACTIVITE`,
`ID_TACHE`
FROM Tache;
Join(activité)
LOAD `ID_ACTIVITE`,
LIBELLE;
SQL SELECT `ID_ACTIVITE`,
LIBELLE
FROM `Type activite`;
//-------- End Multiple Select Statements ------
Résultat :
Je vais essayer de faire d'abord la concaténation, puis la jointure.
The not exists isn't going to work with a resident load. Notice that I used it directly when loading from Excel. If you feel the need to use a resident load, the code is longer:
onglet XL13
Directory;
NoConcatenate
XL13:
LOAD ID,
NOM
FROM
Split_BDD_2013.xlsx
(ooxml, embedded labels, table is BDD_2013);
onglet XL12
Directory;
NoConcatenate
XL12:
LOAD ID as ID2,
NOM
FROM
Split_BDD_2012.xlsx
(ooxml, embedded labels, table is BDD_2012);
onglet XL
NoConcatenate
tout_xl:
LOAD ID, NOM Resident XL13;
Concatenate(tout_xl)
LOAD ID2 as ID, NOM Resident XL12 Where not Exists(ID,ID2);
DROP Tables XL13, XL12;