Internett: www.wis.no E-post: wis@wis.no
Tlf: 7245 0190 Fax: 7245 0191

Startsiden | Produkter | Drift | Markedsføring | Ta kontakt | Gå til
Søk:
Logg innLogg inn 

WIS blogg


Posten er slettet - ved innsetting av nye poster
Av: Ove Halseth Onsdag 16.11.2011 (08:36)

Når en kjører insert spørringer hvor dataene hentes fra ODBC tabeller så kan en snuble over denne feilen:

Posten er slettet

Microsoft Office Access -Posten er slettet

 

Løsningen min tidligere var og hente inn dataene i en ny tabell i access, og så bruke den tabellen for å opprette nye poster.

Men så oppdaget jeg denne settingen på egenskapssiden til spørringen:

Egenskapsside

Og nøkkelverdien her er Entydige verdier, for om en endrer denne til Ja så kjører spørringen helt fint!

Nok ett tilfelle som støtter opp om teorien min:

For enhver feilmelding så er det en hake begravd ett eller annet sted i instillingene som skulle ha vært huket av.

Ove B-)

--Emner: Access, Database/SQL
Kommentarer: 0





VBA UrlEncode
Av: Ove Halseth Lørdag 30.10.2010 (22:43)

I ett prosjekt så hadde vi behov for å poste en url. Problemet var bare at æøå rotet til alt på serversiden, og vi fikk ikke ut parametrene.

Etter litt googling så fant vi fort diverse varianter av UrlEncode, deriblandt en versjon som skulle støtte UTF-8:

http://stackoverflow.com/questions/218181/how-can-i-url-encode-a-string-in-excel-vba

Men vi kom ikke helt i mål, for vi fikk ikke konverteringen til UTF-8 til å virke:-( Nytt dykk i google kom opp med:

http://www.codenewsgroups.net/vb/t13396-widechartomultibyte-utf-8.aspx

Som ga oss konvertering til UTF-8.

Resultatet ble:


Private Declare Function WideCharToMultiByte Lib "Kernel32.dll" ( _
    ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, _
    ByVal cchWideChar As Long, ByVal lpMultiByteStr As String, ByVal cbMultiByte As Long, _
    ByVal lpDefaultChar As String, ByRef lpUsedDefaultChar As Long) As Long
Private Declare Function MultiByteToWideChar Lib "Kernel32.dll" ( _
    ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As String, _
    ByVal cbMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long

Private Const CP_UTF8 As Long = 65001   ' UTF-8 translation

Public Function ToUTF8(ByRef inString As String) As String
    Dim BufLen As Long

    BufLen = WideCharToMultiByte(CP_UTF8, 0&, ByVal StrPtr(inString), _
        Len(inString), vbNullString, 0&, vbNullString, ByVal 0&)
    If (BufLen > 0) Then
        ToUTF8 = Space$(BufLen)
        Call WideCharToMultiByte(CP_UTF8, 0&, ByVal StrPtr(inString), _
            Len(inString), ToUTF8, BufLen, vbNullString, ByVal 0&)
    End If
End Function

Public Function FromUTF8(ByRef inString As String) As String
    Dim BufLen As Long

    BufLen = MultiByteToWideChar(CP_UTF8, 0&, inString, -1, 0&, 0&)
    If (BufLen > 0) Then
        FromUTF8 = Space$(BufLen)
        BufLen = MultiByteToWideChar(CP_UTF8, 0&, inString, _
            Len(inString), ByVal StrPtr(FromUTF8), BufLen)
        FromUTF8 = Left$(FromUTF8, BufLen) ' Trim null
    End If
End Function

 

Public Function UrlEncode( _
   StringVal As String, _
   Optional SpaceAsPlus As Boolean = False, _
   Optional UTF8Encode As Boolean = True _
) As String
 
Dim StringValCopy As String
Dim StringLen As Long

StringValCopy = IIf(UTF8Encode, ToUTF8(StringVal), StringVal)
StringLen = Len(StringValCopy)

If StringLen > 0 Then
    ReDim Result(StringLen) As String
    Dim I As Long, CharCode As Integer
    Dim Char As String, Space As String
 
  If SpaceAsPlus Then Space = "+" Else Space = "%20"
 
  For I = 1 To StringLen
    Char = Mid$(StringValCopy, I, 1)
    CharCode = Asc(Char)
    Select Case CharCode
      Case 97 To 122, 65 To 90, 48 To 57, 45, 46, 95, 126
        Result(I) = Char
      Case 32
        Result(I) = Space
      Case 0 To 15
        Result(I) = "%0" & Hex(CharCode)
      Case Else
        Result(I) = "%" & Hex(CharCode)
    End Select
  Next I
  UrlEncode = Join(Result, "")
 
End If
End Function


'From http://stackoverflow.com/questions/218181/how-can-i-url-encode-a-string-in-excel-vba
Public Function UrlEncode( _
   StringVal As String, _
   Optional SpaceAsPlus As Boolean = False, _
   Optional UTF8Encode As Boolean = True _
) As String
 
Dim StringValCopy As String
Dim StringLen As Long

StringValCopy = IIf(UTF8Encode, ToUTF8(StringVal), StringVal)
StringLen = Len(StringValCopy)

If StringLen > 0 Then
    ReDim Result(StringLen) As String
    Dim I As Long, CharCode As Integer
    Dim Char As String, Space As String
 
  If SpaceAsPlus Then Space = "+" Else Space = "%20"
 
  For I = 1 To StringLen
    Char = Mid$(StringValCopy, I, 1)
    CharCode = Asc(Char)
    Select Case CharCode
      Case 97 To 122, 65 To 90, 48 To 57, 45, 46, 95, 126
        Result(I) = Char
      Case 32
        Result(I) = Space
      Case 0 To 15
        Result(I) = "%0" & Hex(CharCode)
      Case Else
        Result(I) = "%" & Hex(CharCode)
    End Select
  Next I
  UrlEncode = Join(Result, "")
 
End If
End Function

 

Ove B-)

--Emner: Access, Utvikling, VBA
Kommentarer: 0





Kan ikke slette i de angitte tabellene
Av: Ove Halseth Mandag 23.08.2010 (07:22)

MsAccess Kan ikke sletteOfte når jeg støter på problemer i Windows så har jeg på følelsen av at det finns sikkert en sjekkboks for dette problemet ett sted.

Problemet er bare og finne ut hva sjekkboksen heter og hvor den er gjemt.

 

Grunnen til at du leser denne bloggen er kanskje fordi du har støtt borti denne feilmeldingen i MSAccess:

"Kan ikke slette i de angitte tabellene"

 

Da har jeg en god nyhet! Om ikke en sjekkboks så fins det en setting som "slår av" denne feilmeldingen.

- Når du har spørringen fremme, så trykk Alt-Enter for å få frem egenskapssiden til spørringen.

- Her setter du Entydige poster til Ja.

 

Entydige poster er altså navnet på dette problemets hake...

Løsningen ble funnet hos Microsoft kundestøtte! Etter litt googling.

 

Mvh

Ove B-)

--Emner: Access, Database/SQL, Utvikling
Kommentarer: 0





Retilkobling av tabeller i Access
Av: Ove Halseth Mandag 03.05.2010 (12:53)

I en god del access prosjekt så benytter vi to databaser, en front og en database.

 

Problemet er ofte at databasene får forskjellig sti hos oss og hos kunden. Noe som gjør at en må knytte opp tabellene på nytt.

Tidligere benyttet vi denne koden:

  For Each Tdf In CurrentDb.TableDefs
    If Tdf.Connect <> "" Then
      strTable = Tdf.Name
      CurrentDb.TableDefs(strTable).Connect = ";DATABASE=<sti>\<backenddb>.mdb"
      CurrentDb.TableDefs(strTable).RefreshLink '(Denne gir feilmelding)
    End If
  Next

 

Men den feiler nå på .RefreshLink, og feilen er at en ikke får satt .Connect til ny sti.

Løsningen var og slette koblingen og opprette den på nytt:

  For Each Tdf In CurrentDb.TableDefs
    If Tdf.Connect <> "" Then
      strTable = Tdf.Name
      CurrentDb.TableDefs.Delete strTable
      Set td = CurrentDb.CreateTableDef(strTable, dbAttachSavePWD, strTable, ";DATABASE=<sti>\<backenddb>.mdb")
      CurrentDb.TableDefs.Append td
    End If
  Next

 

Ove B-)

--Emner: Access, VBA
Kommentarer: 0





Regulære utrykk(RegExp) i Access VBA
Av: Ove Halseth Søndag 27.04.2008 (06:50)

 

Eller: Hvordan konvertere phpBB til ren HTML i Access VBA

 

"Om du er en seriøs programmerer så bør RegExp sitte i fingertuppene"

Hørt noe tilsvarende?

 

Vel, fikk i oppgave her forleden og konvertere ett phpBB-forum til ren HTML, og jeg er ikke en racer på RegExp.

Og en skal ikke ta store dykket i RegExp før en skjønner hvorfor RegExp er TESTEN for en programmerer.

 

Men det skal heller ikke store dykket til for å løse så enkle oppgaver som phpBB2HTML.

Her er det du trenger for å løse enkle oppgaver i RegExp:

1. .* - matcher alle tegn

2. .*? - matcher alle tegn, men er ikke grådig, så den stopper ved første forekomst

3. (.*?) treffer det samme som .*? men forskjellen er at når du plasserer søket i () så kan du bruke treffet i strengen du skal erstatte med. Første forekomst av (.*?) tilsvarer $1 i resultat strengen.

4. \ - lar deg søke etter spesialtegn.

 

Eksempel:

Oppgaven er og konvertere:

[url=http://wikipedia.org]Wikipedia[/url]

til:

<a href="http://wikipedia.org">Wikipedia</a>

 

Løsning:

  Regex.Pattern = "\[url\=(.*?)\](.*?)\[/url.*?\]"
  str = Regex.Replace(str, "<a href=$1>$2</a>")

 

Forklaring:

\[url\=   matcher   [url=

så må vi ta vare på adressen:

(.*?)    matcher   "http://wikipedia.org"   og tar vare på det som matcher i variablen $1

\]   matcher   første ]

(.*?)   matcher   Wikipedia   og tar vare på det som matcher i variablen $2

\[/url.*?\]   matcher   [/url]   .*? er tatt med pga at enkelte tager hadde en id i seg: [/url:9878998]

Hele strengen som matcher blir så erstattet med "<a href=$1>$2</a>  der $1 = "http://wikipedia.org" og $2 = Wikipedia

Så slutt resultatet blir: <a href="http://wikipedia.org">Wikipedia</a>

 

Dette ble en veldig kort og overfladisk innføring i regulære uttrykk, men forhåpentlig nok til å fange interessen og inspirere til dypere dykk.

Snorkling i regexp: Microsofts korte innføring i VBA's RegExp

Dypdykking: regular-expressions.info

For lettere kunne teste ut dine regulære uttrykk så anbefaler jeg RegExTester eller Rubular

 

'VBA funksjonen slik den ble til slutt

Public Function phpBB2HTML(str) As String ' Konverter PHPBB kode til html-kode

  'Sjekk om vi har innparameter
  If IsNull(str) Then
    FBB = ""
    Exit Function
  End If


  Dim oRegExp As Object
  Set Regex = CreateObject("VBScript.RegExp")
  With Regex
    .Global = True
    .IgnoreCase = True
    .MultiLine = True
  End With
  '[url]
  Regex.Pattern = "\[url\](.*?)\[/url.*?\]"
  str = Regex.Replace(str, "<a href=""$1"">$1</a>")
  Regex.Pattern = "\[url\=(.*?)\](.*?)\[/url.*?\]"
  str = Regex.Replace(str, "<a href=""$1"">$2</a>")
  '[img]
  Regex.Pattern = "\[img\](.*?)\[/img.*?\]"
  str = Regex.Replace(str, "<img src=""$1"">")
  '[size=15:987327837]
  Regex.Pattern = "\[size\=(.*?):.*?\]"
  str = Regex.Replace(str, "<span style=""font-size:$1px"">")
  Regex.Pattern = "\[\/size.*?\]"
  str = Regex.Replace(str, "</p></span>")
  '[color=#FF0000]Red Text[/color]
  Regex.Pattern = "\[color\=(.*?)\]"
  str = Regex.Replace(str, "<span style=""color:$1"">")
  Regex.Pattern = "\[\/color.*?\]"
  str = Regex.Replace(str, "</p></span>")
  '[quote]
  Regex.Pattern = "\[quote.*?\]"
  str = Regex.Replace(str, "<blockquote><p>")
  Regex.Pattern = "\[\/quote.*?\]"
  str = Regex.Replace(str, "</p></blockquote>")
  '[code]
  Regex.Pattern = "\[code.*?\]"
  str = Regex.Replace(str, "<pre>")
  Regex.Pattern = "\[\/code.*?\]"
  str = Regex.Replace(str, "</pre>")
  '[b]
  Regex.Pattern = "\[b.*?\]"
  str = Regex.Replace(str, "<b>")
  Regex.Pattern = "\[\/b.*?\]"
  str = Regex.Replace(str, "</b>")
  '[i]
  Regex.Pattern = "\[i.*?\]"
  str = Regex.Replace(str, "<i>")
  Regex.Pattern = "\[\/i.*?\]"
  str = Regex.Replace(str, "</i>")
  '[u]
  Regex.Pattern = "\[u.*?\]"
  str = Regex.Replace(str, "<u>")
  Regex.Pattern = "\[\/u.*?\]"
  str = Regex.Replace(str, "</u>")
  '[list]
  Regex.Pattern = "\[list.*?\]"
  str = Regex.Replace(str, "")
  Regex.Pattern = "\[\/list.*?\]"
  str = Regex.Replace(str, "")
  'linjeskift
  str = Replace(str, vbCrLf, "<br>")
  
  FBB = str
  
  Set Regex = Nothing

End Function

 

 

Ett lite hint til slutt i forbindelse med phpBB konvertering, og det er at datoer blir i MySql lagret som sekunder etter 1970-01-01 00:00:00. Dvs for å få frem korrekt dato så må en bruke funksjonen DateAdd("s", dato, "1970-01-01 00:00:00")

 

Mvh

Ove B-)

--Emner: Access, VBA
Kommentarer: 0





Access og musehjul...
Av: Ove Halseth Tirsdag 22.04.2008 (00:26)

 

Skrollehjul på musa er den lille tuen som kan velte en stor Access applikasjon....

 

 

Musehjul

Sikkert flere enn meg som har vært ute for at brukere klager over at tekst forsvinner/ data havner på feil post / data havner på nye poster.

Da vi jeg anbefale at dere sjekker ut hva som skjer når dere står i forskjellige skjema og ruller med musehjulet...

 

Løsningen fant jeg på nett i Lebans Holdings 1999 Ltd: MouseWheelOnOff

 

Her kan en laste ned en zip-fil som inneholder en dll som du kopierer ned i samme mappe som din accessdatabase, og en accessdatabase som du må åpne og kopiere Modulen: modMouseHook inn i din accessdatabase.

 

Etter det så kan du ved hjelp av ett par kodelinje slå rullehjulet av:

Dim blRet As Boolean
blRet = MouseWheelOFF

MouseWheelOnOff skal slå av rullehjulet for alle kontroller untatt tekstbokser, listebokser og postnavigering.

 

Musehjul - Access sin store plage:-)

Min erfaringer at den fungerer utmerket i og stoppe brukeren fra og utilsiktet endre posten de står på, men jeg sliter med og få til skrolling i tekstboks i subskjema...

 

mvh

Ove B-)

 

--Emner: Access
Kommentarer: 0





Monitorere endringer i filer og foldere vha VBA og ActiveX i MS Access
Av: Ove Halseth Søndag 20.04.2008 (22:52)

Har ved mange anledninger kunne tenkt meg å overvåke mapper eller filer for endringer i Access.

I forbindelse med at vi ønsket ekstern editor for tekstbokser i Access så satte jeg meg ned og googlet til jeg fant løsningen i:

The access webs: File Change Notification Component

 Som i følge nettsiden lar deg: 

"... allows you to set up watches on one or more folders (optionally including the entire subfolder tree) so that any changes made to the folders result in a notification being sent back to you. The notification event depends on the kind of watch you've set up on a folder (for example, notify on size changes and creates) and contains information about the specific file that has been changed."

 

 

 

 

 

 

I vår Access applikasjon ønsket vi som sagt og redigere tekst i en tekstboks i ekstern editor. Løsningen ble å lagre innholdet i tekstboksen til en tekstfil i en mappe som jeg overvåker.

Når jeg så åpner ekstern editor(PSPad) med tekstfilen og lagrer så vil jeg kunne fange opp det i Access og hente inn teksten fra den endrede filen og oppdatere tekstboksen.

 

Ett par ting som er verdt og nevne:

1. Legg til dll'en i VBA editoren Tools - References

2. Koden som starter overvåkningen kan ikke legges på ett skjemas onOpen, fordi eksekveringen vil ikke gå videre etter Call clsFCN.StartWatch. Løsningen var og legge koden på skjemaets timer.

 

Resultatet ble denne lille demo databasen:

FilMonitorering.zip

VBA koden er i hovedsak knabbet fra VB eksemplet som fulgte med komponenten.

 

For å teste så må du først laste ned FileChangeNotificationComponent og registrere dll-en som følger med.

Pakk så ut filene i FilMonitorering.zip i en egen mappe, start opp FilMonitorering.mdb, rediger fila RedigerMeg.txt, lagre og se hva som skjer i Access:-)

 

Access filmonitorering

 

mvh

Ove B-)

--Emner: Access, VBA
Kommentarer: 0





Angi unikt felt for linkede tabeller i Access
Av: Ove Halseth Mandag 14.04.2008 (23:20)

På grunn av at Sybase ikke liker Primary Key og Unique constraint på samme felt så droppet vi Unique constraint på alle PK i alle tabeller.

(For mer info sjekk: http://www.sybase.com/detail?id=1032350)

 

Noe som gjorde at når vi linket tabellene i Access så visste ikke Access lengre hvilket felt som var unikt. => Access spør for hver tabell som skal linkes inn hvilket felt som er unikt.

Om en skipper og angi hvilket felt som er unikt så blir tabellen skrivebeskyttet.

 

Så det sier seg selv at med 400+ tabeller og ditto 400+ forekomster av denne dialogen:

Access: Velg en entydig postidentifikator

Så begynte det å bli litt pes og linke tabellene på nytt.

Etter mye googling fant jeg omsider denne løsningen: http://www.mrexcel.com/forum/showthread.php?t=33366&page=2

 

Som ga denne funksjonen:

Function BuildTableLink(strDSNName as String,strTableName as String, strExternalTableName as String, strUniqueFieldName as String)

  Dim db As Database
  Dim tdf As TableDef
  Dim strDDL As String

 

  Set db = CurrentDb

  'Create linked table
  Set tdf = db.CreateTableDef(strTableName)
  tdf.Connect = "ODBC;DSN=" & strDSNName

  tdf.SourceTableName = strExternalTableName
  db.TableDefs.Append tdf

 

  'Set unique information

  strDDL = "CREATE UNIQUE INDEX _uniqueindex ON " & _
           strTableName & " (" & strFieldName & ")" & _
           "WITH PRIMARY;"

  db.Execute strDDL

End Function

 

Ove B-)

 

--Emner: Access, Sybase
Kommentarer: 0





Tilgang til utklippstavlen fra Access/VBA
Av: Ove Halseth Mandag 14.04.2008 (22:24)

Access/VBA har ingen funksjoner eller prosedyrer som lar deg jobbe med utklippstavlen.

Etter litt googling fant jeg denne løsningen på http://www.cpearson.com/excel/clipboard.htm:

 

I VBA editoren, gå til Tools - References og legg til referanse til Microsoft Forms 2.0

Finner du ikke Microsoft Forms 2.0 i listen, så velg Browse og bla deg frem til FM20.dll som ligger i C:\windows\system32

 

Trikset er og gå via DataObject:

Kopiere til utklippstavla:

Dim MyDataObj As New DataObject

MyDataObj.SetText  "Dette skal på utklippstavla..."  'Lagrer tekst i MyDataObj som i neste omgang havner på Utklippstavla
MyDataObj.PutInClipboard

 

Kopiere fra utklippstavla:

MyDataObj.GetFromClipboard

Dim strUtklippstavla as String

strUtklippstavla = MyDataObj.GetText


Ut fra dette så kan vi lage følgende prosedyrer:

Public Sub PutOnClipboard(str as String)
    Dim MyDataObj As New DataObject
    MyDataObj.SetText str
    MyDataObj.PutInClipboard
End Sub

Public Function GetOffClipboard() As String
    Dim MyDataObj As New DataObject
    MyDataObj.GetFromClipboard
    GetOffClipboard = MyDataObj.GetText()
End Function


Public Sub ClearClipboard()
    Dim MyDataObj As New DataObject
    MyDataObj.SetText ""
    MyDataObj.PutInClipboard
End Sub

 

 Ove B-)

--Emner: Access, VBA
Kommentarer: 0





Skrivekonflikt med Access front og MS Sql backend
Av: Ove Halseth Fredag 22.02.2008 (14:12)

 

Under flytting av bak-databasen vår fra Access til MSSql server så gikk det meste greit bortsett fra att nye poste opprettet via kode i Access front databasen ikke kunne redigeres.

Det som skjedde var at vi fikk denne feilmeldingen:

Access skrivekonflikt

Skrivekonflikt

Denne posten har blitt endret av en annen bruker...

 

Og da er senarioet som følger:

Access 2003 i front med linkede tabeller fra en MS Sql server express.

Eksempel på kode for oppretting av ny post:

  Dim rs As Recordset
  Dim Id As Long
 
  Set rs = db.OpenRecordset("Skole", dbOpenDynaset, dbSeeChanges)
 
  rs.AddNew
    rs!Navn = "<Ny>"
    rs!Skoletype = "X"
    If v(13) = "*" Then
      rs!SkoleLov = "F"
    Else
      rs!SkoleLov = v(13)
    End If
  rs.Update
  rs.Move 0, rs.LastModified
  Id = rs!Id
 
  rs.Close

I Access så får en også skrivekonflikt om en går rett på den linkede tabellen og prøver og redigere posten.

Om en redigerer posten i MS Sql admin så kan en etterpå redigere posten i Access.

 

Løsningen fant jeg i en diskusjon på thescripts.com:

http://www.thescripts.com/forum/post723918-3.html

 

Og den var og legge til et felt i alle tabeller av typen timestamp. Retilknyttet de linkede tabellene og problemet var løst!!!

Hent ut navnet på alle linkede tabeller og kjør denne spørringen på MS Sql databasen:

Alter table <tabellnavn> Add ts timestamp NOT NULL

 

Ove B-)

--Emner: Access, Database/SQL
Kommentarer: 1


 
 Nye poster
Fixing missing (30.05.2012)
Redirect dll us (30.05.2012)
Laste ned passo (11.05.2012)
Bare si "Nei ti (12.12.2011)
Posten er slett (16.11.2011)
 Søk
 
 Populære emner
Access  Ajax  Ansatte  Brannmur  Database/SQL  Debugging  Delphi  FortiClient  Fortigate  GSI  Hjemmet  Html  Internett  iPhone  iPhone Apps  Java  JavaScript  JVM  Nerdehumor  Nettverk  Operativsystem  Palm  Servere  Skrivere  Sybase  Utvikling  VBA  Vista  VPN  Web 2.0  Windows  WinXP  WIS  Wis Tiltak  WisWeb 1  WisWeb 2  Word  XML
 Vis måned
Mai 2012 (3)
Desember 2011 (1)
November 2011 (1)
September 2011 (2)
August 2011 (1)
 Vis fra forfatter
Ove Halseth (46)
Dag Waade (9)
Stig Runar Vangen (7)
Svein Waade (6)
Inge Valaas (1)
Inger Berg (1)
Kristian Ljøkelsøy Vitsø (1)