Avatar billede l3kris Nybegynder
24. april 2015 - 09:42 Der er 10 kommentarer og
1 løsning

Datamakro sendEmail fra flere tabeller

Jeg har brug for at kunne sende en email direkte fra min Access database (2013 / 365).

Jeg har to tabeller: tblKlientData og tblForløb. I tblKlientData skal der hentes navn og emailadresse, og fra tblForløb skal der hentes dato for aftale.

Datamakroen skal aktiveres via en knap i en formular. Formularen viser indholdet af en forespørgsel fspAftaler, som henter data fra både tblKlientData og tblForløb. Hver side i formularen viser kun én aftale med én klient.

Svaret må meget gerne være ret udførligt, da jeg er ny i Access 2013 (har tidligere brugt 2003). Jeg har læst manualer og kan også finde ud af at lave en datamakro, der henter emailadressen fra en tabel - men det går helt galt, når jeg prøver at kombinere to tabeller :-P
Avatar billede fdata Forsker
28. april 2015 - 10:25 #1
Du skal oprette en forespørgsel, som kombinerer de to tabeller via et nøglefelt (formodentlig et kundenr). Brug så denne forespørgsel som udgangspunkt for din kørsel i stedet for bare at køre direkte på kundetabellen.
Avatar billede l3kris Nybegynder
28. april 2015 - 11:28 #2
Forespørgslen hedder fspAftaler, og nøglefeltet er kundenummeret, netop som du gætter på. Så langt var jeg kommet, men jeg kan ikke få datamakroen til at fungere sammen med forespørgslen.
Avatar billede fdata Forsker
28. april 2015 - 12:11 #3
Du skriver: "Jeg har læst manualer og kan også finde ud af at lave en datamakro, der henter emailadressen fra en tabel". Det er jo præcis samme fremgangsmåde, når du bruger en forespørgsel.
I stedet for at referere til tblKlientData skal du bare bruge fspAftaler.

Hvad er det helt præcist, du går i stå på?
Avatar billede l3kris Nybegynder
28. april 2015 - 12:32 #4
Helt præcist går jeg i stå på, at jeg ikke kan lave opslag igennem fspAftaler.

Min datamakro (som jeg gerne ville have den til at se ud):

Slå en post op i    fspAftaler
WHERE

SendEmail
Til                =[fspAftaler].[KlientEmail]
Cc
Bcc
Emne                "Et emne"
Meddelelse          ="Kære " & [fpsAftaler].[Klientnavn] & ". Vi ses " & [fspAftaler].[AftaleDato]

Problemet er, at jeg ikke kan vælge [fspAftaler] under SendEmail - dér kan jeg kun vælge [tblKlientData].
Avatar billede fdata Forsker
28. april 2015 - 16:41 #5
Ahaaa. Nu forstår jeg.  Du mener virkelig Data Makro. Tit kalder e's brugere VBA kode for makroer, så jeg misforstod. Sorry.

Hvorfor går du via en datamakro? De anvendes jo som regel ifm. indsættelse og sletning i tabeller.

Hvis du bare vil sende en email, kan du jo fint bruge en lille funktion, som f.eks. dette klip fra Microsoft Access 2010 Programmer's Reference:

Public Function CreateEmailWithOutlook( _
      MessageTo As String, _
      Subject As String, _
      MessageBody As String)

  ' Define app variable and get Outlook using the "New" keyword
  Dim olApp As New Outlook.Application
  Dim olMailItem As Outlook.MailItem  ' An Outlook Mail item

  ' Create a new email object
  Set olMailItem = olApp.CreateItem(olMailItem)

  ' Add the To/Subject/Body to the message and display the message
  With olMailItem
      .To = MessageTo
      .Subject = Subject
      .Body = MessageBody
      .Display    ' To show the email message to the user
'      .Send      ' Send the message immediately

  End With

  ' Release all object variables
  Set olMailItem = Nothing
  Set olApp = Nothing
End Function

Læg koden i et tilfældigt modul og kald funktionen med de fundne værdier i fpsAftaler:

  CreateEmailWithOutlook(KlientEmail,"Et emne", "Kære " & Klientnavn & ". Vi ses " & AftaleDato)
Avatar billede l3kris Nybegynder
28. april 2015 - 17:31 #6
Alt forladt :) Ja, jeg mente virkelig datamakro, og årsagen var, at den automatisk anvender ID på den post / klient, der bliver vist i min formular. Som sagt: ved simpelt opslag i kun én tabel er det meget lettere end VBA - så jeg tænkte, at der også måtte være en lige så nem løsning via en forespørgsel, men at jeg bare ikke kunne gennemskue den.

Jeg prøver lige koden af i aften - det springende punkt er, om den nøjes med at sende til kun den ene klient, der bliver vist i formularen... :)
Avatar billede l3kris Nybegynder
29. april 2015 - 12:47 #7
Jeg bliver da sindssyg af dette her (og føler mig temmelig dum)!

Hvordan får jeg overhovedet kørt en VBA-kode fra en knap i en formular?

Jeg er helt nede på det niveau, hvor jeg i min formular laver en knap, højreklikker på den og vælger Generér Hændelsesprocedure - Kodegenerator. Dette åbner VBA-editoren, som allerede har skrevet

Private Sub Kommandoknap130_Click()

End Sub

I mellem disse linjer tilføjer jeg blot MsgBox ("Test"). Når jeg så trykker på knappen, får jeg fejlmeddelelsen, at "Udtrykket VedKlik, du indtastede som indstilling af hændelsesegenskaben, gav en fejl: Der opstod et problem, mens Microsoft Access kommunikerede med OLE-serveren eller Active-X objektet."

Hvad gør jeg mon galt?
Avatar billede fdata Forsker
29. april 2015 - 17:35 #8
Rolig nu  :O)

Mht. koden:
Du har helt ret. Du burde bare kunne kalde funktionen, f.eks.:

Private Sub Kommandoknap130_Click()
Call CreateEmailWithOutlook(Me.KlientEmail,"Et emne", "Kære " & Me.Klientnavn & ". Vi ses " & Me.AftaleDato)
End Sub


Mht. fejlen:
Det er jo helt sort! Der er jo ingen OLE-server indblandet i en MsgBox.

Det virker som om, du måske har noget andet kode et eller andet sted, der fejler. (Access bliver af og til lidt forvirret)

Gå til VBA editoren (Alt-F11) og vælg Debug/Compile. Så findes Access måske fejlen for dig.
Hvis ikke, må du manuelt gennemgå din base for at finde den komponent (og det er et Active-X objekt), der fremkalder fejlen.
Avatar billede l3kris Nybegynder
29. april 2015 - 21:44 #9
Se, det forklarer jo en hel del.

Jeg kunne ingen fejl finde, heller ikke selv om jeg stykke for stykke slettede næsten alting udover tabellerne (efter at have taget backup, selvfølgelig).

Så eksporterede jeg tabeller, forespørgsler og formularer en for en for at se, om fejlen også ville være i den nye database, og i givet fald hvor. Til sidst havde jeg en eksakt kopi af den originale database - men helt uden fejlmeddelse...

Så nu må jeg i gang med at få det til at virke. Tak for hjælpen so far - jeg venter lige med at lukke, til jeg ser, om jeg stadig har brug for hjælp med det egentlige problem :)
Avatar billede l3kris Nybegynder
30. april 2015 - 21:50 #10
Altså, hvor var det nemt, når Access besluttede sig for at lege med :)

I tilfælde af at andre arbejder i Access 2013 og får lyst til at lege med, så vil jeg lige gøre opmærksom på en lille ændring i VBA-koden (Outlookobjektet skal dannes):


Public Function CreateEmailWithOutlook( _
      MessageTo As String, _
      Subject As String, _
      MessageBody As String)

  ' Define app variable and get Outlook
  Dim olApp As Outlook.Application
  Dim olMailItem As Outlook.MailItem  ' An Outlook Mail item

  'Create an Outlook object
  Set olApp = CreateObject("Outlook.Application")

  ' Create a new email object
  Set olMailItem = olApp.CreateItem(olMailItem)

  ' Add the To/Subject/Body to the message and display the message
  With olMailItem
      .To = MessageTo
      .Subject = Subject
      .Body = MessageBody
      .Display    ' To show the email message to the user
'      .Send      ' Send the message immediately

  End With

  ' Release all object variables
  Set olMailItem = Nothing
  Set olApp = Nothing
End Function

I hvert fald virkede ovenstående for mig, mens 2010-versionen gav fejlmeddelelse.

Jeg vil også nævne, at at jeg i stedet for .Body brugte .HTMLBody, hvorved jeg kunne bruge html-tags og gøre meddelelsen noget kønnere at se på.

Tak for hjælpen og tålmodigheden, fdata!
Avatar billede fdata Forsker
05. maj 2015 - 12:57 #11
Velbekomme. Fint at du poster den endelige løsning!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester