Avatar billede faroe Nybegynder
06. december 2002 - 09:52 Der er 56 kommentarer og
3 løsninger

Er der nogen som har et forslag?

Er der nogen som har et forslag?
Jeg har lavet en form med en under formular, under formularen er i grid format.
Fx Jeg har skrevet 20 linjer, og nu vil jeg sætte en ny linje ind mellem linje Fx 10 og  11.
Er det nogen som har et fornuftig forslag?
Faroe:)
Avatar billede terry Ekspert
06. december 2002 - 10:05 #1
faroe>First, did you get your answer concerning Keypress?

Now this question! Can you give some more infromation as to what you mean exactly when you say the form is in grid format and it contains 20 lines. and now you want to place a line between 10 and 11?
Do you maen you have a sub form showing 20 records and you wnat to insert a line between the 10th and 11th records?

Well I cant see what information you have on the form so it isnt too easy to give a solution.  Records are displayed depending on sort or etc. so this has to be taken into account when inserting a new record. It could be possible to add a record at the end, but IF the sort order is correct then it will get displayed in the correct possition when the form gets refreshed.
Avatar billede juks Novice
06. december 2002 - 10:06 #2
i en tekstbox ?
prøv at trykke F2 på feltet og for at lave ny linje ctrl + enter
Avatar billede faroe Nybegynder
06. december 2002 - 10:21 #3
>>TERRY. Nei jeg har iki. jeg satser på din gode viden:)))))))))
Avatar billede fdata Forsker
06. december 2002 - 10:29 #4
Hvis posterne er sorteret i f.eks. ID orden (autonummer felt), kunne du løse det således (quick-and-dirty):

Private Sub InsLinKnap_Click()
  Dim Husk As Long
  If Not Me.NewRecord Then
    Application.Echo False
    '- Husk aktuel post
    Husk = Me.ID
    '- Kopier sidste
    DoCmd.GoToRecord acActiveDataObject, , acLast
    DoCmd.RunCommand acCmdSelectRecord
    DoCmd.RunCommand acCmdCopy
    '- Indsæt ny
    DoCmd.GoToRecord acActiveDataObject, , acNewRec
    DoCmd.RunCommand acCmdPaste
    '- En baglæns og nulstil
    DoCmd.GoToRecord , , acPrevious
    NulstilPost
    Do Until Me.ID = Husk
      '- En baglæns og kopier
      DoCmd.GoToRecord , , acPrevious
      DoCmd.RunCommand acCmdSelectRecord
      DoCmd.RunCommand acCmdCopy
      '- En frem og sæt ind
      DoCmd.GoToRecord , , acNext
      DoCmd.RunCommand acCmdPaste
      '- En baglæns og nulstil
      DoCmd.GoToRecord , , acPrevious
      NulstilPost
    Loop
    Me.Refresh
    Application.Echo True
  End If
  '- Placér markøren i den indsatte post
  Me.<MitFelt>.SetFocus                   
End Sub

Funktionen NulstilPost skriver du selv. Den initialiserer diverse felter.
Avatar billede faroe Nybegynder
06. december 2002 - 10:37 #5
http://81.18.225.33/form.gif  sådan sær min form ud
Avatar billede faroe Nybegynder
06. december 2002 - 10:49 #6
NulstilPost  Hvvat er det?
Avatar billede terry Ekspert
06. december 2002 - 10:51 #7
You can NOT directly INSERT a line between two existing lines. You can add a record at the end as normal, and by usinging a field containing a value which you can sort by, refresh the form to show the new record at the correct position.
You could have an extra field containing a line number and sort after this. But this would mean you having to enter the number for each record, unless you made some function which could find then next number and default to this. Then If you wanted manually change this number to place the record in another position.
Avatar billede terry Ekspert
06. december 2002 - 10:54 #8
faroe, is it possible for you to send me the database containing your previous question concerning keypress? I must admit I still dont quite undertsand the problem!
Avatar billede faroe Nybegynder
06. december 2002 - 10:57 #9
>>Terry
jo jeg har linje nummer
1
2
3
5
6
7
8
9

men nor jeg sætter en linje ind på record fx 3 sær det sådan ud

1
2
3
3
4
5
Avatar billede proc Nybegynder
06. december 2002 - 10:57 #10
Hvordan er dine linier sorteret? Det er svært af indsææte en linie på et bestemt sted, for brugeren har mulighed for at ændre sortering...

Hvis du fratager brugeren denne mulighed, kunne du jo lave et felt der hedder linienummer, og så sortere på det. Når du så vil indsætte en ny linie, finder du linienummeret på CurrentRecord, lægger én til alle linienumre herover, og giver den nye post samme nummer. Det lyder kryptisk, men noget i den her stil:

//Knap til Indsæt linie:

//Læs linienummer på nuværende linie, f.eks. 12

//For linienummer 12 til Sidste, linienummer=Linienummer+1

//RecordCreate, linienummer=linienummer på nuværende linie...

På denne måde indsættes linien før den linie du står på. "Koden" er selvfølgelig noget vrøvl, den må du selv skrive - det ser jo ud til at du er godt på vej...
Avatar billede terry Ekspert
06. december 2002 - 11:08 #11
so your line number must have an increment seed of say 10 and not 1. Then this enables you to insert lines between them.
Avatar billede faroe Nybegynder
06. december 2002 - 11:15 #12
>> terry din mail adresse
Avatar billede proc Nybegynder
06. december 2002 - 11:17 #13
Har lige kigget i http://www.eksperten.dk/spm/290900, og kommenteret det, se lige om det er noget du kan bruge...
Avatar billede proc Nybegynder
06. december 2002 - 11:22 #14
>>terry: Nåe, ligesom i de gode gamle basic-dage, med nummerede kodelinier ;)
Men hvad så hvis brugeren ønsker at indsætte 11 linier? Nej, han er nødt til at ændre linienumrene på de større eksisterende poster...
Avatar billede terry Ekspert
06. december 2002 - 11:29 #15
Yes you are right, it will be necessary to change the interval for the other values if he wants to insert many lines. He can obviosuly start with a larger interval though.
Life is hard at times :o)

Another posibility is to NOT enter lines directly into the grid, but to a line placed on the header of the form. Then you could have a button for adding, which will automatically find then next LINE number. A button for inserting, where you give the line number yourself. and a button for deleting.
Avatar billede faroe Nybegynder
06. december 2002 - 11:38 #16
Det som jeg har tænkt at lave er, at når jeg står på en bestemt linje og trykker på fx F4 så skal linjen sættet ind
Grunden er, at visse en bruger skriver en faktura og har skreven mange linjer og så skal han have mulighed får at sættet
En ny linje ind på faktoren der han vil have den
Avatar billede fdata Forsker
06. december 2002 - 11:48 #17
Igen: Hvis vi forudsætter, at fakturalinierne er sorteret i oprettelsesorden (via et Autonummer felt) fungerer koden i mit svar fra 10:29.
Funktionen NulstilPost nulstiller bare felterne i din post. Grunden til at jeg ikke kan give dig koden er, at jeg jo ikke kender dine feltnavne.
Avatar billede terry Ekspert
06. december 2002 - 11:50 #18
faroe I think we know what you want, its just a "simple" case of finding HOW to do it :o)
No matter which method is used you will need to be able to change the value of the line numbers.
Avatar billede faroe Nybegynder
06. december 2002 - 11:54 #19
>>fdata.  har du en database som du har skrevet koden i???
vi er det muligt at få en
Avatar billede fdata Forsker
06. december 2002 - 11:57 #20
Or maybe not, Terry  ;o) ....
Turn the problem around. In stead of wedging a new record in between the existing you simple move all records one position down the line. This results in an empty record at the current position - ready to fill in.
This method of course only makes sense when we're talking about a limited number of records (Faroe mentions around 20).
Avatar billede terry Ekspert
06. december 2002 - 12:01 #21
Yes but the empty record MUST contain some value to sort it by, otherwise as soon as the record is writen to the dB and the form gets refreshed it WILL NOT be there where it was. Or am I totally of track ? :o)
Avatar billede fdata Forsker
06. december 2002 - 12:02 #22
>>Faroe
Det er meget enkelt:
1. Opret en knap med navnet InsLinKnap på din subform.
2. Kopier min kode over i din base.
3. Skriv en lille rutine, der nulstiller:
Private Sub NulstilPost()
  Me.Nummar=Null
  Me.Nøgd=Null
  Me.Akr=0
  'osv
End Sub
4. Go!
Avatar billede fdata Forsker
06. december 2002 - 12:07 #23
I think you are. The records contain an Autonumber field. The procedure only copies the data fields from one record to the next - leaving the numbers intact.
The last record is copied into a new record which of course (as it is autonumbered) gets a new, higher number than the preceding records.
The first record that was moved leaves an empty record behind - still with the old number.
U see?
Avatar billede fdata Forsker
06. december 2002 - 12:09 #24
My last remark of course is for Terry.
Avatar billede faroe Nybegynder
06. december 2002 - 12:13 #25
>>fdata. dit forslag fungerer, men vis man har fx 10.000 faktura linker hvat så??
Avatar billede terry Ekspert
06. december 2002 - 12:14 #26
Well that is one way to do it and as long as there arent many records fine.
Avatar billede faroe Nybegynder
06. december 2002 - 12:20 #27
Problemet er at jeg har maaaaaaaaaaaaaaaaaaange records
Avatar billede fdata Forsker
06. december 2002 - 12:22 #28
Rolig nu. Jeg tog udgangspunkt i at der var tale om få linier og jeg skrev også "quick-and-dirty". Hvis du opretter 10.000 fakturalinier er metoden urealistisk.
Men så igen: Er det almindeligt for jer at have tusindvis af linier på hver faktura? Hvis Ja, må andre træde til med mere raffinerede forslag.
Avatar billede fdata Forsker
06. december 2002 - 12:23 #29
Hov, jeg havde ikke set dit sidste indlæg. Nu er jeg bare nysgerrig: Hvor mange?
Avatar billede faroe Nybegynder
06. december 2002 - 12:24 #30
ps når jeg har kørt koden og flytter fra filt til feil ser den dådan ud
http://81.18.225.33/form.gif  alle felterne bliver markeret
Avatar billede faroe Nybegynder
06. december 2002 - 12:25 #31
Avatar billede faroe Nybegynder
06. december 2002 - 12:26 #32
ca 10.000 og det kommer flere:(
Avatar billede faroe Nybegynder
06. december 2002 - 12:27 #33
hvis jeg har ca 100  records så kører det fint:)
Avatar billede fdata Forsker
06. december 2002 - 12:32 #34
I rest my case. Som sagt: Den er kun smart til få linier, hvilket du nu har bevist. Jeg har ingen metode, der kan håndtere 10.000 linier.
Hm. Printer I fakturaerne ud? Det vil jo give omkring 200 sider pr. faktura!
Avatar billede faroe Nybegynder
06. december 2002 - 12:39 #35
Jeg laver en ny linje ID for vær records vær gang jeg laver en ny faktura
Den starter med 1 og så tæller den op for vær gang jeg skriver en ny linje
Er det noget som kan brugets??
Avatar billede proc Nybegynder
06. december 2002 - 12:42 #36
Hey Fdata, du er vist på vej ud af en "farlig" tangent ;)

Du koder en funktion, som er ekstremt ressourcekrævende, da den "hopper" frem og tilbage flere gange for hver eneste linie! Men hvad værre er, du smadrer totalt enhver mulighed for senere at lave nogen som helst form for statistik!

På et tidspunkt ønsker brugeren flere funktioner - det gør de jo altid - som f.eks. at kunne følge en ordrelinie fra tilbud over bestilling og levering til fakturering. Men du udskifter indholdet i linien med indholdet fra en anden linie! Samtidig opretter du en nu linie til gammelt indhold og fylder nyt indhold i en ny linie - prøv liiiige at finde ud af hvornår en vare er faktureret ud fra de givne omstændigheder!?!

Nej, linieindholdet er nød til at være troværdigt, f.eks. oprettelsestidspunkt osv. Det der skal ske, er udelukkende at et felt med liniens placering skifter værdi. Så bliver der naturligt plads til at indsætte en NY linie, med rigtigt oprettelsestidspunkt, lagerafgang m.m.

Noget i stil med:

Private Sub Insert_line()
Dim snap
Snap = Me.LineNumber

'"Slukker" skærmopdateringen og går til første post
  Application.Echo False
  DoCmd.GoToRecord , , , acFirst

'Forøger linienummeret med én, hvis det er >= nuværende linie.
'Fortsætter til fejl, dvs. til der ikke er flere poster
  Jump:
  On Error Goto New
  If Me.LineNumber >=Snap then Me.LineNumber=Me.LineNumber+1
  DoCmd.GoToRecord , , , acNext
  Goto Jump

'Opretter ny post og giver den det "gamle" linienummer
  New:
  DoCmd.GoToRecord , , , acNewRec
  Me.LineNumber=Snap
 
'Opdaterer posterne (og dermed rækkefølgen), og "Tænder" skærmen igen
  Me.Refresh
  Application.Echo True
Avatar billede terry Ekspert
06. december 2002 - 12:44 #37
a quick update statment to increase the line number of all records from the line that you are on.

UPDATE YourTable SET LineNumber = LneNumber+1 WHERE LineNumber >= TheLineYourOn AND .... the rest is up to you.
BUT it must NOT be an autonumber field!
Avatar billede faroe Nybegynder
06. december 2002 - 12:45 #38
det er den underformular
main Formular  Fakturanr 100
underformular=
LinID = autonummer felt

LineID  Linjenr  Fakturanr    Varenr
1515    1        100          Testvaernr 
1516    2        100          Testvaernr
1517    3        100          Testvaernr 
1518    4        100          Testvaernr
1519    5        100          Testvaernr 
1520    6        100          Testvaernr
Avatar billede proc Nybegynder
06. december 2002 - 12:48 #39
Øh, det er lidt forvirrende med rækkefølgen, når der er flere aktive i et spm., men mon ikke vi finder ud af det...

>>Faroe 12:39: Jo, hver linie skal naturligvis have et ID. Men den skal også have tilknytning til fakturahovedet, og det er nemmest hvis du har en relation med tvunget referentiel integritet, kaskadevis opdatering og kaskadevis sletning. Så kan du slette en faktura uden at have "døde" linier i din database...

Men det er ikke ID-et du skal sortere på. Du er nød til at have et felt, som udelukkende bruges til at holde styr på linien placering på den aktuelle faktura.
Avatar billede proc Nybegynder
06. december 2002 - 12:50 #40
>>Faroe 12:45: Helt fornuftigt, men du skal sortere på linjenr, ikke LineID...
Avatar billede terry Ekspert
06. december 2002 - 12:52 #41
SQL = "UPDATE YourTable SET Linjenr = Linjenr+1 WHERE Linjenr >= " & Me.Linjenr & " AND Fakturanr = " & Me.Fakturanr

This requires you to sort the records on the sub form after Linjenr.
Avatar billede proc Nybegynder
06. december 2002 - 12:57 #42
>>terry 12:52: I can see, that we are moving in the same direction. Your code is a lot faster however, so I rest my case. Btw. I should have been at a customer ten minutes ago ;(

Keep up the good work, both faroe and terry. You are on track...
Avatar billede faroe Nybegynder
06. december 2002 - 13:10 #43
Jeg må lige teste mulighederne, nu er det så mange muligheder:))))))))))))))
Avatar billede terry Ekspert
06. december 2002 - 13:20 #44
faroe>my email eksperten@santhell.dk
Avatar billede faroe Nybegynder
06. december 2002 - 13:25 #45
>> Terry sent til eksperten@santhell.dk
Avatar billede faroe Nybegynder
06. december 2002 - 13:52 #46
>>fdata Hvorfor???
Private Sub InsLinKnap

når jeg har kørt koden og flytter fra filt til feil ser den dådan ud
http://81.18.225.33/grid.gif  alle felterne bliver markeret
Avatar billede fdata Forsker
06. december 2002 - 14:02 #47
Jeg er ikke helt med. Markerer Access flere felter samtidig, når du går hen gennem linien? Der er ikke noget i koden, der skulle forårsage det.

Men .... hvorfor piske en død hest? Hvorfor opretter du ikke et linienummer og bruger terrys snedige lille update?
Det er da meget renere end min løsning (som ja ja, proc, ikke var helt gennemtænkt, "quick-and-dirty" som sagt). Terry wins again  ;o)
Avatar billede terry Ekspert
06. december 2002 - 14:16 #48
but faroe still has to get it working before its much use for anything :o)
Avatar billede faroe Nybegynder
06. december 2002 - 14:17 #49
Ja men dit forslag er fint jeg kan bruge det andre steder:) en i faktura linerne
Avatar billede faroe Nybegynder
06. december 2002 - 14:20 #50
>>terry
Jeg er ikke så god til ren SQL jeg får en fejl når jeg kører den

NB.Ean = Linje Nummer

DoCmd.RunSQL "UPDATE Faktura-útgreining SET Ean = Ean + 1 WHERE Ean >= " & Me![Fakturi-útgreining.EAN] & " AND Faktura_nr = " & Me.Faktura_nr
Avatar billede faroe Nybegynder
06. december 2002 - 14:21 #51
PS Terry fik du min mail??
Avatar billede terry Ekspert
06. december 2002 - 14:31 #52
yes got your mail, just need to put the grey cells in action :o)

DoCmd.RunSQL "UPDATE [Faktura-útgreining] SET Ean = Ean + 1 WHERE Ean >= " & Me![Fakturi-útgreining.EAN] & " AND [Faktura_nr] = " & Me.Faktura_nr

I assume Me![Fakturi-útgreining.EAN] is a field in the table and NOT on the form?
Avatar billede fdata Forsker
06. december 2002 - 14:39 #53
Skal det være Me![Fakturi-útgreining].[EAN]
i stedet for Me![Fakturi-útgreining.EAN] ?
Avatar billede fdata Forsker
06. december 2002 - 14:40 #54
Sorry. Klikkede Udfør for tidligt. Jeg mente:

DoCmd.RunSQL "UPDATE [Faktura-útgreining] SET Ean = Ean + 1 WHERE Ean >= " & Me.EAN & " AND [Faktura_nr] = " & Me.Faktura_nr
Avatar billede terry Ekspert
06. december 2002 - 14:47 #55
yes, I need glasses :o)
Avatar billede faroe Nybegynder
06. december 2002 - 15:04 #56
:)
Avatar billede terry Ekspert
07. december 2002 - 12:56 #57
faroe>how far are we with this question?
Avatar billede faroe Nybegynder
09. december 2002 - 09:49 #58
fdata dit svar kan jeg buge, og Terry jeg kan også bruge dit svar:)
Proc dit svar har jeg ikki prøvet på jeg delet points
Terry 40 Point
fdata 40 Point
Proc  20 Point
Avatar billede proc Nybegynder
09. december 2002 - 11:01 #59
Helt fint med mig, mit bud var jo også mere overordnet og ikke så meget "hands-on"...

...men hvor meget "krudt" har du brugt på at sætte dig ind i "reglerne" for databaser? Jeg tænker på sådan noget som normalisering af data, integritet og standardiseret navngivning. Det er noget af det der står først i diverse bøger - det er det afsnit man som regel springer over ;)
Men du ser ud til at være godt på vej med noget reelt brugbart, og så kan det faktisk godt betale sig at læse - og bruge - noget af det tørre stof. Så får du ikke problemer med fakturalinier som "flyder", manuel opdatering ved momsændringer, dårlig ydelse ved skalering, fejl ved forskellige sprog og versioner m.m.
Det tager nogle timer at tygge sig igennem, og også et par timer at tilrette sit projekt. Men det er meget nemmere nu mens du udvikler, end når du har 16.000 kundeinputs i databasen... Tro mig, jeg taler af erfaring!
(Jeg er nu nået til min femte generation af løsninger over seks år, og nu er den der snart ;) )
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