Avatar billede tommyrasmussen Nybegynder
21. september 2004 - 08:13 Der er 24 kommentarer og
1 løsning

Søg efter tekststreng

Jeg er ved at lave en SMS-gateway med integration til en Access database. Da jeg er forholdsvis nystartet er det muligvis en stor mundfuld.
Imidlertid har jeg et irritationsmoment, jeg ikke rigtigt ved hvad jeg skal gøre ved.

SMS-gatewayen opretter en post i databasen med SMS beskeden, samt afsenders telefonnummer med mere. Selve beskeden sættes i ét felt og kan f.eks. være "ID34,300,340,355,322"

Beskeden kommer fra en PLC-controller som afgiver måleresultater fra 4 temperaturfølere samt den eget ID nummer.

Disse værdier vil jeg gerne have indsat i en anden tabel i samme database. Denne tabel indeholder et felt med ID nummer samt 4 felter der hver skal indeholde værdierne fra ovenstående temperaturfølere.

Jeg skal altså have skrevet noget kode der går ind og kigger på sms-beskeden og indsætter tingene i en anden tabel hvor der så er 5 felter: 1.felt er boksens ID (34), 2.felt er værdien fra føler 1 (300), 3.felt er værdien fra føler 2 (340), 4. felt er værdien fra føler 3(355), og 5.felt er værdien fra føler 4 (322).

Jeg ved ikke om jeg har beskrevet det grundigt nok, men ellers vil jeg gerne uddybe spørgsmålet.

Hvis der er nogen der umiddelbart ved hvad man skal gøre vil det være en stor hjælp.

På forhånd tak
Avatar billede jensen363 Forsker
21. september 2004 - 08:26 #1
Du kan dele tekststrengen ved hjælp af syntaxen Left(), Mid() eller Right()

Dvs. Left([ID],2) = 34
    Mid([ID]3,3) = 300

osv.
Avatar billede jensen363 Forsker
21. september 2004 - 08:29 #2
Korrekt syntax er :

SELECT Left([SMS],4) AS Felt1, Mid([SMS],6,3) AS Felt2 .....
FROM Tabel;
Avatar billede tommyrasmussen Nybegynder
21. september 2004 - 09:43 #3
Tak for svaret.
Jeg havde godt nok håbet på lidt mere uddybende omkring
selve kodningen. F.eks. hvor skal koden oprettes, hvor tit
skal koden køre (f.eks. hver gang en ny sms-besked indløber) og
hvordan får jeg det til at ske automatisk.
Avatar billede jensen363 Forsker
21. september 2004 - 09:47 #4
Det klarer vi nok hen ad vejen. Hvad konkret forventer du output skal være ?

Hvad trigger opdateringen af tabellen ?
Avatar billede jensen363 Forsker
21. september 2004 - 09:58 #5
Her er noget vi kan bygge videre på ...

Function DecodeString()

Dim strSQL As String
Dim db As DAO.Database

    Set db = CurrentDb()

    strSQL = "INSERT INTO tblDecodedSMS ( ID, FELT1, FELT2, FELT3, FELT4 )"
    strSQL = strSQL & "SELECT Mid([SMS],3,2) AS ID, "
    strSQL = strSQL & "Mid([SMS],6,3) AS FELT1, "
    strSQL = strSQL & "Mid([SMS],10,3) AS FELT2, "
    strSQL = strSQL & "Mid([SMS],14,3) AS FELT3, "
    strSQL = strSQL & "Mid([SMS],18,3) AS FELT4 "
    strSQL = strSQL & "FROM tblSMS;"

    db.Execute strSQL

End Function
Avatar billede tommyrasmussen Nybegynder
21. september 2004 - 10:00 #6
Output skulle jo gerne være en tabel der indeholder
alle data der modtages via sms-beskeder.

Opdateringen af tabellen for indgående sms-beskeder sker jo så snart
en sms-besked modtages fra gatewayen. Jeg benytter en sms gateway fra
http://www.ozeki.hu

Denne er forbundet til en access database med en tabel for indkommende sms-beskeder og en tabel for udgående sms-beskeder. De udgående springer vi lige hen over i første omgang, men for at de indgående skal kunne bruges til noget fornuftigt skal jeg altså have opdateret den omtalte nye tabel med temperaturdata hver gang tabellen for indgående sms-beskeder tilføjes en ny post.
Avatar billede tommyrasmussen Nybegynder
21. september 2004 - 10:02 #7
OK

Der kom du mig lige i forkøbet.
Skal jeg bare sætte denne kode ind i access vba editoren ?
Hvordan trigger vi koden ?
Avatar billede tommyrasmussen Nybegynder
21. september 2004 - 10:13 #8
Man kan iøvrigt se hvordan den tilhørende access database
ser ud - og downloade den via nedenstående link.
Det er det jeg har gjort, og vil så bygge videre på denne database,
men har ikke før prøvet at programmere VBA i access.
http://www.ozeki.hu/index.phtml?ow_page_number=174
Avatar billede jensen363 Forsker
21. september 2004 - 10:13 #9
Det som koden pt. gør er at lave et opslag i tblSMS hvor tekststrengen findes, splitter denne ad, og tilføjer resultatet i tblDecodedSMS. Er det nogenlunde det du som udgangspunkt vil gøre ???
Avatar billede tommyrasmussen Nybegynder
21. september 2004 - 10:21 #10
Ja det er udmærket som udgangspunkt.

Jeg har lige prøvet men får nogle fejlmeddelelser.
Skal jeg eventuelt sende databasen, så vi lige taler om det samme.
Avatar billede jensen363 Forsker
21. september 2004 - 10:33 #11
Du skal lige huske at have reference til DAO
Avatar billede tommyrasmussen Nybegynder
21. september 2004 - 10:47 #12
jeg er ikke sikker på jeg forstår.
Jeg har nu sat X i DAO i reference, men det hjælper ikke.

Når jeg prøver at køre koden skriver den:
Microsoft Jet-databasemotoren kan ikke finde inputtabllen eller forespørgslen
"tblsms". Kontroller at den findes og at navnet er stavet korrekt.

Jeg har ændret navnet SMS på koden så den svarer til den rigtige tabel.
Samtidigt har jeg ændret navnet på alle linierne så de svarer til det rigtige felt i inputtabellen.
Avatar billede jensen363 Forsker
21. september 2004 - 10:50 #13
Prøv lige at zippe basen og send den til : ose@post.dk
Avatar billede tommyrasmussen Nybegynder
21. september 2004 - 11:14 #14
Jeg fik i mellemtiden løst problemet med fejlmeddelelsen.
Det vil sige at det faktisk virker nu.
Så er det bare lige at få fundet ud af hvordan man trigger koden, så
den ikke kører mere end én gang når det er nødvendigt.
Desuden skal man vel have den til at undgå at tilføje poster der allerede er tilføjet én gang.
Avatar billede jensen363 Forsker
21. september 2004 - 11:30 #15
Hvis du fjerner dit autonummereringsfelt fra Data-tabellen, og gør de øvrige felter til nøglefelter, udgør de tilsammen en unik nøgle, som ikke kan forekomme mere end een gang. Dette til virker som begrænsning for programkoden, som så ikke opdatere posten igen.
Avatar billede tommyrasmussen Nybegynder
21. september 2004 - 11:36 #16
Ja, spørgsmålet kræver nok at jeg sætter mig noget mere ind i access, for jeg aner faktisk ikke hvordan man gør.
Man kan vel checke for nye poster på en eller anden måde ?
Avatar billede jensen363 Forsker
21. september 2004 - 11:47 #17
Du kan afvikle eventuelt afvikle koden hver gang du åbner databasen .
Avatar billede tommyrasmussen Nybegynder
21. september 2004 - 11:57 #18
Den metode du foreslog med at gøre de øvrige felter til nøglefelter virker også efter hensigten, så der sker vel ikke noget ved at køre den hver gang man åbner databasen.

Nu regner jeg godt nok med at dette skal køre på en PC der konstant står tændt og modtager SMS-beskeder via dens gateway og konstant skal indsætte disse i databasen.
Samtidigt skal den kunne vise en graf over udviklingen i de modtagne værdier, og måske udskrive dem automatisk en gang i døgnet.

Findes der funktioner i databasen til at køre en kode på bestemte tidspunkter ?
F.eks. en gang i minuttet ?
Avatar billede jensen363 Forsker
21. september 2004 - 13:21 #19
Der findes en timer-funktion, men kender ikke lige syntaxen for at få den til at afvikle koden. Vender tilbage senere
Avatar billede tommyrasmussen Nybegynder
21. september 2004 - 13:22 #20
Jeg accepterer svaret, for det har faktisk været en stor hjælp.
Spørgsmålet om start af kode med faste intervaller har muligvis været belyst før under andre spørgsmål, så jeg kigger lige der.
Avatar billede jensen363 Forsker
21. september 2004 - 13:23 #21
Ok ... men hvis jeg finder en løsning, vender jeg tilbage alligevel
Avatar billede tommyrasmussen Nybegynder
21. september 2004 - 13:28 #22
Tak skal du have.
Jeg er kommet et stort skridt videre.
Avatar billede tommyrasmussen Nybegynder
21. september 2004 - 13:38 #23
Kan dette eventuelt bruges ?

Har fundet det via følgende link: http://eksperten.dk/spm/75027

Sub Form_Load()
    Me.TimerInterval = 1000
End Sub


Private Sub Form_Timer()
Dim StartTime As Date
Dim StopTime As Date


    StartTime = #12:49:00 PM#
    StopTime = #12:49:01 PM#
   
    If Time >= StartTime And Time < StopTime Then
        \' Run macro.
        Debug.Print \"Run Macro...\"
        \'DoCmd.RunMacro (\"Yourmacro\")
    Else
        \' Don\'t run macro.
        Debug.Print \"Don\'t run Macro...\"
    End If

End Sub
Avatar billede jensen363 Forsker
21. september 2004 - 13:48 #24
Ikke helt, den aktiverer kun funktionen een gang, du skal have en funktion som via loop afvikler funktionen gentagne gange
Avatar billede jensen363 Forsker
21. september 2004 - 14:30 #25
Hvis du åbner databasen men en formular ( eksempelvis Hovedformular ), han du benytte denne kode ( i formularen ) :

Option Compare Database

Sub Form_Load()
    Me.TimerInterval = 6000
End Sub

Sub Form_Timer()
    DecodeString
End Sub

Den afvikler funktionen een gang i minuttet, sålænge formularen er åben
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
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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