2013-04-10 3 views
0

Premier article ici. J'utilise <CFSPREADSHEET> pour créer une requête à partir d'Excel, puis j'essaie d'insérer les résultats de la requête dans la table MySQL. Cela fonctionne bien. J'ai également besoin de prendre une valeur d'une colonne et d'insérer son numéro d'identification correct dans la colonne ID du tableau. Voici mon code. Les résultats que je reçois est le même ID (6) est inséré dans chaque ligne de table. Aide ici serait sûrement apprécié. Merci!ColdFusion10 - requête cfloop sur une requête d'insertion

<cfspreadsheet action="read" 
src="#myFile#" 
sheet="5" 
excludeheaderrow="true" 
headerrow="1" 
query="newQuery" /> 

<cfloop query="newQuery"> 
    <!--- set ID variables ---> 
    <cfif newQuery.Branch EQ "Army"> 
    <cfset variables.Branch_ID = 6 /> 
    <cfelseif newQuery.Branch EQ "Marine Corps"> 
    <cfset variables.Branch_ID EQ 9 /> 
    <cfelseif newQuery.Branch EQ "Navy"> 
    <cfset variables.Branch_ID EQ 7 /> 
    <cfelseif newQuery.Branch EQ "Air Force"> 
    <cfset variables.Branch_ID EQ 8 /> 
    <cfelseif newQuery.Branch EQ "Coast Guard"> 
    <cfset variables.Branch_ID EQ 10 /> 
    </cfif> 

    <cfquery name="importXLS" datasource="memorials_mysql"> 
    INSERT INTO honorees_temp(FirsttName,MName,LastName,Branch,Branch_ID,Unit) 
    VALUES 
    ('#Trim(FirstName)#', 
    '#Trim(MName)#', 
    '#Trim(LastName)#', 
    '#Trim(Branch)#', 
    #variables.Branch_ID#, 
    '#Trim(Unit)#') 
    </cfquery> 
</cfloop> 
+0

Quel champ ID? Est-ce que ID est un champ dans MySQL qui devrait être auto_increment mais qui ne l'est pas? – Busches

+0

Si 'Branch_ID' existe dans une table db, vous pouvez également utiliser' INSERT/SELECT' pour sélectionner l'ID de l'autre table et insérer les valeurs dans la même instruction, et éliminer les blocs if/else. – Leigh

Répondre

0

réinitialiser votre variables.brand_id à 0 à chaque fois que la boucle vous. Vous n'obtenez probablement pas de correspondance dans vos instructions IF, ce qui permet de conserver la valeur de la dernière correspondance pour chaque enregistrement sans correspondance ultérieur.

<cfspreadsheet action="read" 
       src="#myFile#" 
     sheet="5" 
     excludeheaderrow="true" 
     headerrow="1" 
     query="newQuery" /> 
<cfloop query="newQuery"> 
    **<cfset variables.Branch_id=0>** 
     <!--- set ID variables ---> 
     <cfif newQuery.Branch EQ "Army"> 
      <cfset variables.Branch_ID = 6 /> 
     <cfelseif newQuery.Branch EQ "Marine Corps"> 
      <cfset variables.Branch_ID = 9 /> 
     <cfelseif newQuery.Branch EQ "Navy"> 
      <cfset variables.Branch_ID = 7 /> 
     <cfelseif newQuery.Branch = "Air Force"> 
      <cfset variables.Branch_= EQ 8 /> 
     <cfelseif newQuery.Branch EQ "Coast Guard"> 
      <cfset variables.Branch_ID = 10 /> 
     </cfif> 

    <cfquery name="importXLS" datasource="memorials_mysql"> 
      INSERT INTO honorees_temp(FirsttName,MName,LastName,Branch,Branch_ID,Unit) 
      VALUES 
       ('#Trim(FirstName)#', 
       '#Trim(MName)#', 
       '#Trim(LastName)#', 
       '#Trim(Branch)#', 
       #variables.Branch_ID#, 
       '#Trim(Unit)#') 
</cfquery> 
</cfloop> 
4

Un problème est que vous avez une erreur de syntaxe dans vos cfset déclarations. Dans cfset vous devez utiliser = au lieu de EQ.

<!--- set ID variables ---> 
    <cfif newQuery.Branch EQ "Army"> 
     <cfset variables.Branch_ID = 6 /> 
    <cfelseif newQuery.Branch EQ "Marine Corps"> 
     <cfset variables.Branch_ID =9 /> 
    <cfelseif newQuery.Branch EQ "Navy"> 
     <cfset variables.Branch_ID =7 /> 
    <cfelseif newQuery.Branch EQ "Air Force"> 
     <cfset variables.Branch_ID = 8 /> 
    <cfelseif newQuery.Branch EQ "Coast Guard"> 
     <cfset variables.Branch_ID =10 /> 
    </cfif> 

Quelles sont vos valeurs de newQuery.Branch? Si rien ne correspond dans votre instruction if, elle conservera la dernière valeur car elle n'est pas réinitialisée

Vous devez également utiliser <cfqueryparam> sur vos instructions INSERT.

Aussi, et c'est plus une préférence personnelle, mais l'utilisation d'un cfswitch est plus efficace que l'utilisation de plusieurs instructions else if.

<cfswitch expression="#trim(newQuery.Branch)#"> 
    <cfcase value="Army" > 
    <cfset Branch_ID = 6 />  
    </cfcase> 
    <cfcase value="Marine Corps" > 
    <cfset Branch_ID = 9 />  
    </cfcase> 
    <cfcase value="Navy" > 
    <cfset Branch_ID = 7 />  
    </cfcase> 
    <cfcase value="Air Force" > 
    <cfset Branch_ID = 8 />  
    </cfcase> 
    <cfcase value="Coast Guard" > 
    <cfset Branch_ID = 10 />  
    </cfcase> 
    <cfdefaultcase> 
    <!--- set either a default value or throw an error, depending on your needs ---> 
    <cfset Branch_ID = 0> 
    <cfthrow message="Invalid Branch_ID"> 
    </cfdefaultcase> 
</cfswitch> 
+0

Pourrait également mentionner que cette instruction if est la configuration parfaite pour une instruction switch. En outre, il 'Trims()' 'newQuery.Branch' dans l'insert mais pas le' cfif' [e] Ajouter un cas par défaut à ce commutateur aussi. – Busches

+0

Merci Matt! Évidemment, cela a réglé le problème. J'apprécie l'aide rapide. J'espère pouvoir fournir quelques réponses à l'avenir. – RobK

+0

@Busches J'ai mis à jour avec ces deux améliorations –

Questions connexes