2017-08-20 1 views
0

J'ai une table tblCosts que j'affiche sur un frontend msaccess qui permet aux utilisateurs d'ajouter de nouvelles entrées et de mettre à jour celles qui existent déjà. Le tableau est structuré comme ci-dessous.
Condition pour la mise à jour par rapport à l'insertion

ExpenseType  Month  Year  Cost 
Hardware   June  2017  $500 
Software   July  2017  $300 
Hardware   Sept  2017  $150 

J'ai une mise à jour et des requêtes d'insertion qui fonctionnent bien quand exécuter manuellement. Cependant, j'ai de la difficulté à différencier la condition quand déclencher la requête sur le formulaire. Par exemple, si l'enregistrement existe dans la table, il doit exécuter la requête de mise à jour, si l'enregistrement n'existe pas, il doit exécuter la requête d'insertion.

Par exemple, si quelqu'un met en
- Matériel         septembre   $, il devrait mettre à jour la 3ème entrée 150-120 mais si quelqu'un met en
- Meubles         Sept     $ 350
Il doit reconnaître que Furniture ne fait pas partie de la base de données et exécuter la requête d'insertion.
J'ai la mise à jour et insérer des requêtes, mais besoin d'aide pour identifier la condition quand les exécuter.

La requête de mise à jour que je utilise est:

Update tblCosts 
set tblCosts.Cost=[Forms]![frmCost]![txtCost] 
where tblCosts.ExpenseType = [Forms]![frmCost]![txtExpType] 
and tblCosts.Month = [Forms]![frmCost]![txtMonth] 
and tblCosts.Year = [Forms]![frmCost]![txtYear] 

La requête d'insertion J'utilise est:

Insert into tblCosts (ExpenseType , Month, Year, Cost) 
Select [Forms]![frmCost]![txtExpType] as Exp1, 
[Forms]![frmCost]![txtMonth] as Exp2, 
[Forms]![frmCost]![txtYear] as Exp 3, 
[Forms]![frmCost]![txtCost] as Exp 4 
+0

Essayé en utilisant un 'DCount' pour vérifier s'il y avait déjà une entrée? S'il vous plaît nous montrer votre tentative, et comment vous déclenchez la requête (macro ou VBA). –

+0

Ma tentative est basée sur le frontend sans limite msaccess, La requête de mise à jour "Update tblCosts set tblCosts.Cost = [Formulaires]! [FrmCost]! [TxtCost] où tblCosts.ExpenseType = [Forms]! [FrmCost]! [TxtExpType] et tblCosts.Month = [Forms]! [frmCost]! [txtMonth] et tblCosts.Year = [Forms]! [frmCost]! [txtYear] – Anup

+0

Et la requête d'insertion: Insérer dans tblCosts (ExpenseType, Month, Year, Cost) Sélectionnez [Forms]! [FrmCost]! [TxtExpType] comme Exp1, [Forms]! [FrmCost]! [TxtMonth] comme Exp2, [Forms]! [FrmCost]![txtYear] comme Exp 3, [Forms]! [frmCost]! [txtCost] comme Exp 4 Comme je l'ai dit, les requêtes de mise à jour et d'insertion s'exécutent quand je les lance manuellement, c'est juste que j'ai besoin d'aide pour les déclencher (insérer si nouvel enregistrement, mettre à jour si l'enregistrement existant) – Anup

Répondre

1

Besoin d'un code VBA (ou macro) derrière une forme qui détermine l'action requête à exécuter. Dans VBA quelque chose comme:

If DCount("*", "tablename", "ExpenseType='" & Me.cbxExpense & "' AND [Month]='" & Me.tbxMonth & "' AND [Year]=" & Me.tbxYear) = 0 Then 
    CurrentDb.Execute "INSERT INTO tablename (Expense, [Month], [Year], Cost) VALUES ('" & Me.cbxExpense & "', '" & Me.tbxMonth & "', " & Me.tbxYear & ", " & Me.tbxCost & ")" 
Else 
    CurrentDb.Execute "UPDATE tablename SET Cost=" & Me.tbxCost & " WHERE Expense='" & Me.cbxExpense & "' AND [Month]='" & Me.tbxMonth & ", [Year]=" & Me.tbxYear 
End If 

Probablement veulent aussi un code de validation pour vous assurer que les quatre contrôles ont données avant d'exécuter des requêtes. Le vrai truc est de savoir dans quel événement mettre le code - le Cost AfterUpdate fonctionnera tant que les autres champs auront les données entrées en premier, sinon la validation échouera et l'utilisateur devra rentrer le coût.

Peut avoir un code qui ne rend pas chaque contrôle disponible jusqu'à ce que la valeur précédente soit entrée.

Mois et Année sont des mots réservés et ne doivent pas utiliser de mots réservés comme noms pour quoi que ce soit.

Il serait préférable d'enregistrer les numéros de mois au lieu des noms de mois à des fins de tri. Pourquoi mettre à jour une valeur qui devrait vraiment être une agrégation calculée des enregistrements de transaction?

+0

Tout à fait d'accord avec tout ici. –

+0

A travaillé pour moi. Thanks June7 – Anup

+0

Heureux que cela a fonctionné et a fait un montage sur ma réponse. – June7