Split table m.b.v. query

Status
Niet open voor verdere reacties.

obiku

Gebruiker
Lid geworden
25 jul 2004
Berichten
60
All,

Wie kan mij op weg helpen met het volgende:
Voor een eigen project, waar ik eerst dacht redelijk gevorderd te zijn loop ik nu tegen problemen. Voor dit project importeer ik d.m.v. een stukje VBA script beide bijgevoegde TXT bestanden. LET OP, dit gebeurd niet te gelijker tijd. Afhankelik wat aangeleverd wordt importeer ik 1 van de 2.
. De kolom HAWB (komt uit de luchtvracht) in het INBOUND bestand Bekijk bijlage INBOUND.txt laat ik eerst door een functie ontdoen van vreemde karakters. Alle waardes in die kolom mogen alleen cijfers of letters zijn. Hierna wil ik die kolom verdelen in3 kolommen. 1 kolom moet alle waardes weergeven die uit 11 cijfers bestaan (AWB), 1 kolom moet alleen alle waardes weergeven die uit 10 cijfers of 9 cijfers en een letter T bestaan (HWB) en 1 kolom met alle overige waardes (REF). De kolom Pallet_id is een unieke referentie voor de gegevens. Nu dacht ik dit eerst goed voor elkaar te hebben door per voorwaarde dit in een tijdelijke tabel te importeren. Na goedkeuring worden alle gegevens in een rationele database geimporteerd. Dat werkte ook goed tot ik me meer met het tweede bestand (INVENTORY) bezig ging houden Bekijk bijlage INVENTORY.txt. Hiervoor moet ik uit gesplitste netwerk database gegevens zoeken die bij deze gegevens passen (AWB, HWB en REF). Jet update van de tijdelijke tabel met de gevonden gegevens geeft nu problemen.

Nu denk ik dat de manier van werken zoals hierboven beschreven niet de beste manier is en dat ik beter dmv queries de gegevens op het scherm kan tonen ipv een werkelijk, al dan niet tijdelijke, database.
Alleen hier loop ik ook tegen een probleem. Als ik een query als hieronder gebruik voor het inbound bestand, wordt alles wel netjes gesplitst, maar als voorbeeld de gegevens die in de kolom AWB moeten staan worden ook weergegeven in de kolommen HWB en REF/ En dat is nou net niet de bedoeling
Code:
SELECT I.Location, fReplaceSChar([HAWB]) AS AWB, fReplaceSChar([HAWB]) AS HWB, fReplaceSChar([HAWB]) AS REF, 
      I.Pallet_id, I.Quantity, I.Extra
FROM tblTEMPImportedCSV AS I
WHERE (((fReplaceSChar([HAWB])) Like "###########"))
OR (((fReplaceSChar([HAWB])) Like "#########[0-9T]"))
OR (((fReplaceSChar([HAWB])) Not Like "##########"
And (fReplaceSChar([HAWB])) Not Like "#########[0-9T]"));
Omdat mijn database te groot is en hij gegevens uit een gesplitste db moet ophalen en wegschrijven is het niet mogelijk deze als bijlage bij te voegen
 
Als het niet teveel tabellen zijn, kan je de (structuur van) de gekoppelde tabellen wel kopieëren en plakken in de frontend, zodat we toch de tabellen hebben. Als hij na comprimeren en zippen nog te groot is, kun je hem wel uploaden naar bijv. mijnbestand.nl. Kunnen we hem daar (hoeft dan niet eens gezipt) ophalen. Ik sta niet te popelen om een complete db na te bouwen voor dit klusje ;)
 
De database bestaat uit een redelijk aantal tabellen, omdat het zipje groter is dan wat ik hier mag uploaden heb ik hem op mijn eigen server gezet.
http://www.familie-smit.nl/forums/files/GWS v0.0.5.0 - kopie.zip

Alle query die zichtbaar zijn, zijn tijdelijke, voor testdoeleinde gemaakte queries. Alle gebruikte queries staan in de vba code. Zie het frmWTS_CD_ImportModule formulier. de txt bestanden uit mijn vorige post moeten dan wel hernoemd worden naar csv :rolleyes:
 
Zal er morgen eens rustig naar kijken.
 
Ik ben zelf ook verder gaan uitzoeken en dat heeft me onderstaande query opgeleverd
Code:
SELECT fReplaceSChar([Location]) AS LOC, 
   IIf(fReplaceSChar([HAWB]) Like "###########", fReplaceSChar([HAWB]),"") AS AWB, 
   IIf(fReplaceSChar([HAWB]) Like "#########[0-9T]", fReplaceSChar([HAWB]),"") AS HWB, 
   IIf(fReplaceSChar([HAWB]) Not Like "###########" And fReplaceSChar([HAWB]) Not Like "#########[0-9T]", fReplaceSChar([HAWB]),"") AS REF
       I.Pallet_id,
       I.Quantity,
       I.Extra
FROM tblTEMPImportedCSV AS I
WHERE ((IIf(fReplaceSChar([HAWB]) Like "###########",fReplaceSChar([HAWB]),"") Like "###########") 
    AND ((I.Pallet_id) Like "[A-Z]#########"))
OR ((IIf(fReplaceSChar([HAWB]) Like "#########[0-9T]",fReplaceSChar([HAWB]),"") Like "#########[0-9T]") 
    AND ((I.Pallet_id) Like "[A-Z]#########"))
OR ((IIf(fReplaceSChar([HAWB]) Not Like "###########" 
        AND fReplaceSChar([HAWB]) Not Like "#########[0-9T]",fReplaceSChar([HAWB]),"") Not Like "###########" 
        AND (IIf(fReplaceSChar([HAWB]) Not Like "###########" 
        AND fReplaceSChar([HAWB]) Not Like "#########[0-9T]",fReplaceSChar([HAWB]),"")) Not Like "#########[0-9T]" 
        AND (IIf(fReplaceSChar([HAWB]) Not Like "###########" 
        AND fReplaceSChar([HAWB]) Not Like "#########[0-9T]",fReplaceSChar([HAWB]),"")) Not Like "[A-Z}########") 
    AND ((I.Pallet_id) Like "[A-Z]#########"));
De IIF statement is qua performance niet de beste oplossing. Maar omdat de CSV tabel tijdelijk gebruikt wordt en nooit groter zal zijn dan 1000 records (en dat is al ruim), zal deze IIf de performance niet erg beinvloeden.

Wat wel een probleem is geworden is dat ik de volgende foutmelding krijg als ik de de gegevens in de veldnamen Loc, Quantity of Extra wil bewerken :(:
Het bijwerken van de gegevens in een gekoppelde tabel wordt niet ondersteund door deze ISAM.
Een tweede probeem komt doordat ik m.b.v. de IIf statement gegevens weergeef. En hierdoor de gegevens in de Veldnamen AWB, HWB, REF en PalletID niet meer kan bewerken. Hierdoor blijft helaas mijn eerste oplossing het beste..
Dat was d.m.v. diverse queries de gegevens vanuit de CSV importeren naar een secundaire tijdelijke tabel. Deze tijdelijke tabel in het formulier weergeven, zodat de gebruiker dan eventueel gegevens kan bewerken (verbeteren). Dit ondanks dat je het liefst niet wil dat een gebruiker direct in een tabel aan het editten is.

Toch voor een ieder die aandacht aan mijn probleem gegeven heeft mijn dank. Eventuele andere oplossingen zijn uiteraard welkom.:thumb:
 
Laatst bewerkt:
Voor een ieder die wil weten wat de fReplaceChar in de query doet... Het is een functie om alle speciale karakters te verwijderen. Zie functie hieronder:
Code:
'**************************************************************************
'Purpose:       Remove all characters other than ascii 48-57, 65-90 and 97-122
'References:
'
'USAGE:         fReplaceSChar("Word", )
'Inputs:        strWord -   Word with unwanted Characters
'Returns:       Cleaned Word
'Author:
'**************************************************************************
Function fReplaceSChar(ByVal strWord As String) As String
On Error GoTo Err_Handler
' this is VBA string for replacing special characters
' ASCII code (0 - 47, 58 - 64, 91 - 96, 123 -)
Dim strChar, strResult As String
Dim intPos, intLen As Integer
  
    intPos = 0
    intLen = Len(strWord)
    strResult = ""
    If intLen = 0 Then
        ' if string length = 0, return result now
        fReplaceSChar = strWord
    Else
        For intPos = 1 To intLen
            strChar = Mid(strWord, intPos, 1)
            ' replace special char by blank space
            If (Asc(strChar) > 47 And Asc(strChar) < 58) Or (Asc(strChar) > 64 And Asc(strChar) < 91) Or (Asc(strChar) > 96 And Asc(strChar) < 123) Then
            Else
                strChar = ""
            End If
            
            strResult = strResult + strChar
        Next intPos
End If

fReplaceSChar = strResult

Exit_Handler:
   Exit Function
Err_Handler:
   Resume Exit_Handler
End Function
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan