06. december 2002 - 09:52Der 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:)
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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.
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.
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.
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!
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...
>>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...
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.
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
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.
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.
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).
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)
>>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!
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?
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.
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!
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??
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
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!
Ø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.
>>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...
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)
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
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 ;) )
Synes godt om
Ny brugerNybegynder
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.