Brisanje TXT

Pomoč pri izdelavi makrov
Odgovori
ROBERT
Prispevkov: 29
Pridružen: Sr Sep 14, 2005 9:55 am

Brisanje TXT

Odgovor Napisal/-a ROBERT »

Pozdravljen ...

Zopet se mučim z brisanjem iz TXT dat.
Cel dan, sreči, da je deževen sem se posvečal formuli, vendar ji nisem bil kos, izbrisal bi namreč vrstico, katera ima na koncu pod vnos koda neko številko in točno ta izbrani zapis bi izbrisal oziroma vse ostale zapise prekopiral v začasno datoteko, ter jo nato spremenil,
to mi je jasno samo tale koda mi ne naredi tega, prosim za pomoč, imam pa sledeč vnos;

Koda: Izberi vse

Dim stevilka As String * 10, ime As String * 15, priimek As String * 15, ostalo As String, datum As Date, vnesel As String, KODA As Integer

Open "c:\delo.DAT" For Input As #1
Open "c:\deloIZH.DAT" For Output As #2

While Not EOF(1)
Line Input #1, VHODNAVRSTICA

If KODA <> Label5.Caption Then

Print #2, VHODNAVRSTICA
End If
Wend
Close #2
Close #1
Kodo imam na formi pod label5.caption in ta pogoj (to številko zapisa) bi rad izbrisal.

Hvala,

R.
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Pozdravljeni,

Ob daniha podatkih vam nažalost ne morem pomagati. S sledečo kodo:

Koda: Izberi vse

While Not EOF(1)
  Line Input #1, VHODNAVRSTICA
  if KODA <> Label5.Caption Then
  Print #2, VHODNAVRSTICA
End If 
vi samo preberete celotno vhodno vrstico, spremenljivke KODA pa nikjer ne določite! Torej sama spremenljivka KODA ni nikoli definirana. Jaz ne vem kakšno strukturo vhodne vrstice imate oz. kje natančno se koda nahaja. Iz vhodne vrstice je potrebno kodo prebrati in jo nato primerjati.
lp,
Matjaž Prtenjak
Administrator
ROBERT
Prispevkov: 29
Pridružen: Sr Sep 14, 2005 9:55 am

Odgovor Napisal/-a ROBERT »

V strukturi zapisa KODA as integer imam določeno številko ki je kot ident za zapis. Ta ident, to številko preberem in jo zapišem v formo v polje Label5.Caption. Nato pa imam tipko Command1, kjer pa bi ta zapis z določenim identom v mojem premeru mi ga prikaže Label5.caption in točno ta zapis bi rad izbrisal.
Imam kodo kjer brišem prek izbire iz List-Boxa, vendar tu še sortiram podatke, tako, da potrebujem samo določen zapis z določeno številko.
Upam, da sem bil dovolj jase?

Hvala za odgovor in lep pozdrav.

R.
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Pozdravljeni,

Kam vi kodo vpišete v oknu, s katerim gumbom jo želite brisati in podobno... nima nobene zveze z vašim problemom. V delčku kode, ki ste mi ga poslali in za katerega sem vam pisal že v prejšnjem sporočilu, vhodni vrstice nikjer ne razbijete na poasamezne elemente!!!
Poglejte koda, ki jo iščete je trivialno preprosta in ste jo pravilno zapisali!

Koda: Izberi vse

Open "c:\delo.DAT" For Input As #1
Open "c:\deloIZH.DAT" For Output As #2

While Not EOF(1)
  Line Input #1, VHODNAVRSTICA

  ' POGLEJTE ŠE ENKRAT!!
  ' NA TEM MESTU IZ VHODNE VRSTICE 
  ' NIKJER NE IZLUŠČITE KODE!!!!!
  ' npr. KODA = Mid(VhodnaVrstica, 50, 10) ali kaj podobnega!
  If KODA <> Label5.Caption Then
    Print #2, VHODNAVRSTICA
  End If 
Wend

Close #2
Close #1 
lp,
Matjaž Prtenjak
Administrator
ROBERT
Prispevkov: 29
Pridružen: Sr Sep 14, 2005 9:55 am

Odgovor Napisal/-a ROBERT »

Kljub probavanju, mi ta koda se vedno ne funkcionira.
Bom posplošil vprašanje.
V datoteko vnašam zapise in sicer po takem vrstnem redu;

Koda: Izberi vse

Dim stevilka As String * 10, ime As String * 15, priimek As String * 15, ostalo As String, datum As Date, vnesel As String, KODA As Integer


to mi vse deluje in se datoteka polni z podatki.
Na koncu imam zapisa 

stevilka as String  'in to je "ID" zapisa.

Sedaj bi pa rad naprimer izbrisal zapis kateri vsebuje stevilka npr. "003", to pa mu podam v text1 (kateri zapis bi izbrisal).

Žal nisem uspel, zato se še enkrat obračam na pomoč.

Hvala.
R.
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Hm,

Vaša zasnova ima več problemov, ki jih nikakor ne morem razumeti, in vam glede na to tudi ne morem pomagati.
  • Ko vi vrstico zapišete.. OK, kako pa jo preberete nazaj v posamezne spremenljivke??? Ko vrstico preberete, veste, da je prvi podatek dolg 10 znakov, drug 15 in tretji 15, kaj pa četrti (ostalo) kolkiko pa je ta dolg? Kako naj program ve, kje se začne datum in potem za datumom, kako dolg je niz 'vnesel', kje se nato začne koda?
  • Kaj je sedaj vam ID zapisa, številka ali koda? Če je številka, zakaj napišete '003', če pa je številka dolga 10 znakov, torej '0000000003' ali pa kar 3, če to pretvorite v celo število!
Da bi vam lahko karkoli smiselnega odgovoril, mi morate povedati, kako je sedaj s tem! Ker kar se same kode tiče, je že napisana 2x - ne bo se spremenila, ostane natanko takšna! Gre le zato, da mi vi določite, kaj točno je ID zapisa!

Poglejte, pod predpostavko, da je ID zapisa številka, potem je koda pač takšna (enaka kot prej!):

Koda: Izberi vse

Open "c:\delo.DAT" For Input As #1
Open "c:\deloIZH.DAT" For Output As #2

While Not EOF(1)
  Line Input #1, VHODNAVRSTICA

  ' preberem ID zapisa, ki je na prvih 10 mestih vhodne vrstice
  ID = Left(VhodnaVrstica, 10)

  ' če prebran ID ni enak vnostu v text1 potem to prepišem v drugo datoteko: 
  If ID <> Text1.Text Then
    Print #2, VHODNAVRSTICA
  End If
Wend

Close #2
Close #1 
lp,
Matjaž Prtenjak
Administrator
ROBERT
Prispevkov: 29
Pridružen: Sr Sep 14, 2005 9:55 am

Odgovor Napisal/-a ROBERT »

Podatke vnašam na sledeči način;

Koda: Izberi vse

Dim VRSTICA
Dim stevilka As String * 10, ime As String * 15, priimek As String * 15, ostalo As String, datum As Date, vnesel As String, KODA As Integer

Open "c:\delo.dat" For Append As #1

  stevilka = Text1: ime = Text2: priimek = Text3: ostalo = Text4: datum = Date: vnesel = Form7.Label3.Caption: KODA = Label5.Caption

Write #1, stevilka, ime, priimek, ostalo, datum, vnesel, KODA
No to je to, me pa zanima, če vnašam z funkcijo Print, je tudi ok, vendar imam problem z branjem, preberem pa z Input # ..., kar mislim, da ni OK, zato uporabljam Write, izpisi pa so ločeni z "narekovaji".

Če se da kaj rešiti se priporočam, bi uporabljal baze Access, kjer teh problemov ne bi imel, je pa problem, ker ne deluje na vseh računalnikh, txt pa dela praktično povsod.

Hvala in lep večer še naprej ...

R.
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Ja torej je vse OK. Podatke znate zapisati in znate jih prebrati. V čem konkretno je torej problem? Če preberete ID zapisa in uporabite kodo, ki sem vam jo zapisal potem vam mora vse delovati.
lp,
Matjaž Prtenjak
Administrator
ROBERT
Prispevkov: 29
Pridružen: Sr Sep 14, 2005 9:55 am

Odgovor Napisal/-a ROBERT »

Ja problem je samo to, da ne naredi željenega, tudi sam sem probaval, preverjal in iskal, kaj naj ne bi delovalo, vendar željenega brisanja še vedno nisem dobil, zakaj pa ne vem, enostavno bi rad izbrisal zapis, ki vsebuje "KODA" , to kodo pa napišem v text1.
To je vsa umetnost, tudi meni se ni zdel tak problem, ampak očitno je, ker mi stvar ne deluje.

Hvala.

R.
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

:),

Očitno vam podatki ne "štimajo", saj nobeden ID ni enak tistemu kar ste vpisali v TextBox. Bo potrebno razhroščevati... VBA ima razhroščevalnik, a bi vam zdajle ne razlagal še tega, zato bova uporabila lažjo pot in preprosto izpisala ID-je ter tisto kar ste vpisali v TextBox; pred vsako iteracijo. Na izhodu boste videli, zakaj se stvari ne ujemajo:

Koda: Izberi vse

  ' vsa koda od prej

  ' izpišete ID, in tisto kar iščete
  Debug.Print "[" & ID & "],[" &  TextBox1.Text & "]"

  ' če prebran ID ni enak vnostu v text1 potem to prepišem v drugo datoteko:
  If ID <> Text1.Text Then
    Print #2, VHODNAVRSTICA
  End If 

  ' preostala koda od prej
lp,
Matjaž Prtenjak
Administrator
ROBERT
Prispevkov: 29
Pridružen: Sr Sep 14, 2005 9:55 am

Odgovor Napisal/-a ROBERT »

Kljub mnogo truda sem še vedno tam kjer sem bil na začetku, tako, da najbolje da stvar poenostaviva in odkrijeva napako.
No podatke zapišem takole:

Koda: Izberi vse

dim koda as double, ime as string * 15, priimek as string * 15

open "c:\baza.txt" for append as #1

koda = text1: ime = text2, priimek = text3

write #1, koda, ime, priimk

close #1
To deluje, sedaj pa se npr v bazi, baza.txt vidim takole;

1 ime1 priimek1
2 ime2 priimek2

in sedaj bi rad izbrisal vrstico, katera vsebuje KODO 1, "to je prva vrstica"
To kodo, oziroma vrstico ki vsebuje kodo pa jo ročno vpišem v text5 in na potrditev z Command1 mi naj to izbriše, oziroma prenese vse druge zapise v npr baza2.txt, kar pa nato zopet spremenim v baza1.txt.

Upam, da mi bo uspelo.

Hvala.
kako sedaj lahko to storim
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Pozdravljeni,

Ker se ta tematika vleče in vleče, pa ne prideva nikamor, sam vam napisal 3 funkcije, ki služijo zapisu podatkov, branju podatkov in njihovemu brisanju. Funkcije so pisane tako da jih preprosto berete in uporabljajo kodo, ki jo vi že poznate:

Koda: Izberi vse

Sub ZapisiPodatke(koda As Double, Ime As String, Priimek As String)
    Open "c:\baza.txt" For Append As #1
        Write #1, koda, Ime, Priimek
    Close #1
End Sub

Function PreberiPodatke(koda As Double, ByRef Ime As String, ByRef Priimek As String) As Boolean
    Dim tmpKoda As Double, tmpIme As String, tmpPriimek As String
    
    PreberiPodatke = False
    Ime = ""
    Priimek = ""
    
    Open "c:\baza.txt" For Input As #1
    Do While (Not EOF(1)) And (Not PreberiPodatke)
        Input #1, tmpKoda, tmpIme, tmpPriimek
        If (tmpKoda = koda) Then
            Ime = tmpIme
            Priimek = tmpPriimek
            PreberiPodatke = True
        End If
    Loop
    Close #1
End Function

Sub BrisiPodatke(koda As Double)
    Dim tmpKoda As Double, tmpIme As String, tmpPriimek As String
    
    Open "c:\baza.txt" For Input As #1
    Open "c:\tmp_baza.txt" For Output As #2
    Do While Not EOF(1)
        Input #1, tmpKoda, tmpIme, tmpPriimek
        If (tmpKoda <> koda) Then
            Write #2, tmpKoda, tmpIme, tmpPriimek
        End If
    Loop
    Close #1
    Close #2
    
    FileCopy "c:\tmp_baza.txt", "c:\baza.txt"
    Kill "c:\tmp_baza.txt"
End Sub

Sub Test()
    ZapisiPodatke 1.9, "Matjaž", "Prtenjak"
    ZapisiPodatke 3.14, "Mojca", "Simič Kosanovič"
    ZapisiPodatke 9.26, "Andrej", "Koren"
    ZapisiPodatke 12.8, "Miha", "Podbregar"
    
    Dim Ime As String, Priimek As String
    Dim nasel As Boolean
    
    nasel = PreberiPodatke(1.9, Ime, Priimek)
    Debug.Print nasel, Ime, Priimek
    nasel = PreberiPodatke(12.8, Ime, Priimek)
    Debug.Print nasel, Ime, Priimek
    nasel = PreberiPodatke(7.3, Ime, Priimek)
    Debug.Print nasel, Ime, Priimek
    nasel = PreberiPodatke(3.14, Ime, Priimek)
    Debug.Print nasel, Ime, Priimek
    
    BrisiPodatke 1.9
    BrisiPodatke 3.14
End Sub
Prva funkcija (ZapisiPodatke) je trivialna in je ne bom razlagal.
Druga (PreberiPodatke) najprej predvideva, da podatka na bo našla zato ime in priimek pobriše, nato bere datoteko in če najde ustrezno kodo, napolni ime in priimek ter konča zanko.
Tretja funkcija pa vse zapise, ki nimajo iskane kode prepisuje v drugo datoteko, na koncu pa novo datoteko prepiše v staro in jo nato izbriše.
Za preizkus pa je zapisana še funkcija (Test), kjer lahko stvari preizkusite in vidite, kako se uporabljajo.
lp,
Matjaž Prtenjak
Administrator
Odgovori