Jag har en tabell i Access där en kolumn är av formatet PM. Jag vill göra en utskrift till Word på selekterade poster och använder då det "gamla hedliga" recordset. Hur får jag ett texten i PM-fältet till Word? Prova: Efter första raden är den infogade texten markerad. Om du då går vidare och infogar innehållet i nästa fält så ersätter det den första texten. Collapse gör att insättningspunkten hamnar efter det som infogades precis som vid TypeText. Detta funkar om kolumnerna är av textformat Hejsan Jag hittade ett ställe och prövade med olika varianter på Tror du bör lagra datat lokalt först. Jag förstår inte detta. Om jag använder If Not IsNull på textformaterat så funkar det, alltså TypeText får något att jibba med. Varför skulle det inte funka med PM-format och hur kolla man då om det fältet är tomt? Om du först kontrollerar datat med När jag skriver Hmmm... Nu blir det inget felmeddelande men det blir heller inget som skrivs i Word så länge det är PM-format. Ok, men innehåller posten något då, tänkte på felmedd med null förut. Det står bara ett namn i fältet och som sagt så kommer namnet in i Worddokumentet om man ändar formatet till text. Är det kanske så att det lagras som Unicode i Access ? efter läget Märkligt ! Morning OK här är hela koden. I command1 hämtas data från databasen och i Command2 skall det skrivas till Word Varför har du två knappar? Tjena igen Jag har två knappar för att jag vill söka först och sedan välja om jag vill skriva ut. Det skall bli så man skall kunna göra fler sökningar och sedan skriva ut allt. Jag vill få det att funka först innan jag fixar med utseendet. Jag skall testa din kod och återkommer. Hoppas den här tråden kan få ett slut nu. Jag menar med "gamla hedeliga sättet" att jag använder recordset. Numera skall det ju vara ADO.NET med dataadaper och dataset. Men skall man distribuera ett program så går det åt Net framework på 20 Mb utöver programmet om man gör det i VB.Net Inte för att jag förstår varför men NU FUNKAR DET!! Hej igenPM-format
Övriga fält går med
Word.Selection.TypeText RS.Fields("ovrigt").ValueSv: PM-format
Word.Selection = rst.Fields("ovrigt")
Word.Selection.Collapse wdCollapseEnd
det ger samma funktion som i TypeText. För snabbare och snyggare hantering kan du kolla VBA-hjälpen om användning av Range istället för Selection
/Åsa HSv: PM-format
Sv: PM-format
If rsSokning.Fields("kungligt").Value <> Empty Then
Word.Selection.TypeText rsSokning.Fields("kungligt").Value
End If
Word.Selection.TypeText (vbCrLf)
Word.Selection.TypeText (vbCrLf)
If Not IsNull(rsSokning.Fields("ovrigt").Value) Then
Word.Selection.TypeText rsSokning.Fields("ovrigt").Value
End If
Word.Selection.TypeText (vbCrLf)
Word.Selection.TypeText (vbCrLf)
If Not IsNull(rsSokning.Fields("namn").Value) Then
Word.Selection.TypeText rsSokning.Fields("namn").Value
End If
men alltså inte när de är av PM-format
att sätta
Word.Selection = rst.Fields("ovrigt")
Word.Selection.Collapse wdCollapseEnd
ger mig ingen skillnad, det blir bara tomt där PM-fältets text skulle vara.Sv: PM-format
Det är inte så att du måste läsa ut datat i "chunks" ?
Ofta så vid blob-fält (Binary Large OBject)
Har ingen bra exempelkod, men sök på blob på tips o trix så hittar du litegrann
Har själv använt denna teknik, dock med SQL-Server.
/JohanSv: PM-format
Word.Selection.TypeText rsSokning("ovrigt").GetChunk(500)
men det blir ingeting ändå. Använder jag GetChunk på rätt sätt?Sv: PM-format
Kör du samma stuk med "If Not IsNull" så tömmer den datat då.
Word.Selection.TypeText får då ingenting att jobba med
/JohanSv: PM-format
Vad menar du med att lagra datat lokalt?Sv: PM-format
If Not IsNull
så försvinner det.
Det första man gör är istället att spara undan det lokalt.
<code>
Dim strDatat as String
strDatat = rsSokning("ovrigt").GetChunk(500)
If Not IsNull(strDatat) Then
Word.Selection.TypeText strDatat
End If
</code>
Dessutom bör man kunna hämta storleken på datat så GetChunk kan få rätt storlek istället för att hårdkoda 500. Om så är fallet kan också jämförelsen göras Storlek > 0.
Måste sticka nu - hade testat själv innan jag postade detta inlägg annars...
/JohanSv: PM-format
strDatat = rsSokning("ovrigt").GetChunk(500)
får jag felmeddelandet
En OLE-DB åtgärd i flera steg generrade fel. Kontrollera alla OLE-DB statusvärden som finns tillgängliga.
Sätter jag samma kod med fältet formaterat som text blir felmeddelandet
Åtgärden är inte tillåten i det här sammanhanget.
Skriver jag
strDatat = rsSokning.Fields("ovrigt").Value
får jag felmeddelandet
Invalid use of Null
fast det inte finns några tomma fält.
Det verkar svårt att få in datat i en lokal variabel.Sv: PM-format
Nu har jag testkört med både DAO 3.51 och ADO 2.5 från VB6 mot en Access97 db.
Använde mig av "rsSokning.Fields("ovrigt").Value" och det verkar funka.
Får inte fel oavsett hur jag gör, varken med null-värden eller med långa strängar.
Observera att jag inte kört med Word utan kastat in datat i en sträng-variabel.
Noterade också att metoden GetChunk tar två parametrar i DAO (Offset, Length)
och en i ADO (Length)
Aha - om det första värdet är null får jag det där.
Testa :
<code>
Dim strDatat as String
strDatat = ""
...
strDatat = strDatat & rsSokning.Fields("ovrigt").Value
...
Word.Selection.TypeText strDatat
</code>
/JohanSv: PM-format
Sv: PM-format
Hos mig blir det en tom sträng av "strDatat = strDatat & NULL"
Långskott :
Datat innehåller tecken som Word inte kan (vill) tolka t.ex. ASCII-kod noll.
/JohanSv: PM-format
Sv: PM-format
Word borde väl greja det iofs men...
Har du kollat PM-fältets innehåll (i debug eller msgbox eller så) ?
/J igenSv: PM-format
strDatat = strDatat & rsSokning.Fields("ovrigt").Value
är strDatat tomSv: PM-format
Testade ju tidigare idag och det funkade klockrent, även på mycket data (typ 3kB).
Natti, nattiSv: PM-format
Testade precis med DAO 3.6 - får data hur fint som helst
<code>
If Not IsNull(rsSokning.Fields("ovrigt").Value) Then
strDatat = rsSokning.Fields("ovrigt").Value
End If
</code>
Kan du inte posta hela kodsnutten ?
/JohanSv: PM-format
Option Explicit
Dim Word As Word.Application
Dim Doc As Word.Document
Dim strDatat As String
Dim op As Boolean
Dim varSokvag As String
Dim conn As New ADODB.Connection
Dim sql As String
Dim rsSokning As New ADODB.Recordset
Private Sub Command1_Click()
If op = True Then
conn.Close
End If
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=d:\historia\data.mdb;uid=Admin" 'Öppnar en koppling mot databasen
op = True
sql = "select * from historia , person where historia.year =" & Combo1.Text & "And historia.Year = person.Year"
Set rsSokning = conn.Execute(sql)
Text1.Text = Text1.Text & rsSokning.Fields("kungligt").Value
Text2.Text = Text2.Text & rsSokning.Fields("ovrigt").Value
Text3.Text = Text3.Text & rsSokning.Fields("namn").Value
End Sub
Private Sub Command2_Click()
Set Word = CreateObject("Word.Application")
Set Doc = Word.Documents.Add
strDatat = ""
If rsSokning.Fields("kungligt").Value <> Empty Then
Word.Selection.TypeText ("Detta hände när " & rsSokning.Fields("namn").Value) & " föddes" 'Rubrik i rapporten
Word.Selection.TypeText (vbCrLf)
Word.Selection.TypeText (vbCrLf)
End If
strDatat = strDatat & rsSokning.Fields("kungligt").Value
Word.Selection.TypeText strDatat
Word.Selection.TypeText (vbCrLf)
Word.Selection.TypeText (vbCrLf)
If Not IsNull(rsSokning.Fields("ovrigt").Value) Then
Word.Selection.TypeText rsSokning.Fields("ovrigt").Value
End If
Word.Selection.TypeText (vbCrLf)
Word.Selection.TypeText (vbCrLf)
If Not IsNull(rsSokning.Fields("namn").Value) Then
Word.Selection.TypeText rsSokning.Fields("namn").Value
End If
Word.Visible = True
conn.Close
op = False
End SubSv: PM-format
<code>
Option Explicit
Private mNamn As String
Private mÖvrigt As String
Private mKungligt As String
Private Sub Command1_Click()
Dim rs As ADODB.Recordset
Dim conn As ADODB.Connection
Dim strSQL As String
Set conn = New ADODB.Connection
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=d:\historia\data.mdb;uid=Admin" 'Öppnar en koppling mot databasen
strSQL = "SELECT *" & vbCrLf & _
"FROM historia INNER JOIN person ON historia.Year = person.Year" & vbCrLf & _
"WHERE historia.year = " & Combo1.Text
Set rs = New ADODB.Recordset
rs.Open strSQL, conn
If rs.EOF Then
Text1.Text = vbNullString
Text2.Text = vbNullString
Text3.Text = vbNullString
Else
mKungligt = & rs("kungligt")
Text1.Text = mKungligt
mÖvrigt = "" & rs("ovrigt")
Text2.Text = mÖvrigt
mNamn = "" & rs("namn")
Text3.Text = mNamn
End If
rs.Close
conn.Close
End Sub
Private Sub Command2_Click()
Dim Word As Word.Application
Dim Doc As Word.Document
Set Word = CreateObject("Word.Application")
Set Doc = Word.Documents.Add()
If Len(mKungligt) Then
'**
'* Rubrik i rapporten
'**
Word.Selection.TypeText ("Detta hände när " & mNamn & " föddes" & vbCrLf & vbCrLf
End If
Word.Selection.TypeText mKungligt & vbCrLf & vbCrLf
If Len(mÖvrigt) > 0 Then
Word.Selection.TypeText mÖvrigt & vbCrLf & vbCrLf
End If
If Len(mNamn) > 0 Then
Word.Selection.TypeText mNamn
End If
Word.Visible = True
End Sub
</code>Sv: PM-format
Du kör ADO, enligt min mening inte "det gamla hederliga sättet".
Mina testkörningar med DAO har varit ganska värdelösa
Vilken version av ADO kör du ?
/JohanSv: PM-format
Sv: PM-format
Därför fortsätter jag med "det gamla hederliga recordset"
Hur får man reda på vilken verson man kör?Sv: PM-format
Tack snälla Andreas och XAdjoSv: PM-format
Ta bort raderna
<code>
Text2.Text =....
If Not Isnull(rsSokning.Fields("ovrigt").Value)
End If
</code>
och ändra till
<code>
strDatat = "" & rsSokning.Fields("ovrigt").Value
Word.Selection.TypeText strDatat
</code>
så funkar det
/Johan