Hej igen och tack för senast! Är inte säker på om jag förstår dig rätt i din problematik men vore det inte bättre att validera ditt formulär först innan du överhuvudtaget skapar ett nytt record? Hej Peter Vad bra att det löste sig! Tack igen! Kan du inte använda dig av metoden "Me.Undo" i formuläret, då skippar du ju posten som du håller på att skapa. Tack för tipset. Eftersom jag inte hittade namnet på fältet i min föregående fråga så försökte jag använda nedanstående rutin, som msoft har som exempel i sin hjälp, Ett sätt att göra det på är så här.DELETA record
Har denhär gången problem med att ”DELETA” ett nybildat record.
Problemet är som följer:
Access 2000 Formulär ”Personer”
M.h.a formuläret hanterar användaren befintliga records och skapar nya records.
Vid situationen Nytt record matar jag ut en ruta där användaren väljer avdelning från en combobox. Därefter bildar jag ett anställningsnummer av innehållet i comboboxen * 1000 + Nya recordets nyckelvärde(räknare). Anställningsnummret blir t.ex 50063 där 63 är nyckelvärdet(Räknarens värde). Rutan innehåller dessutom knapparna ”Ok” och ”Avbryt”.
Antag att användaren har valt avdelning (eller nollat värdet i avdelning comboboxen)(Nytt record har då bildats) men att användaren ändå i detta läge önskar avbryta inmatningen. I det fallet sätter ja anställningsnummret till nyckelns värde, men egentligen vill jag ta bort ”DELETA” det nybildade recordet.
Rutin som handhar situationen när användaren klickar på AVBRYT.
Private Sub cmdNyPersonAvbryt_Click()
If Not IsNull(Nyckel) Then
Anstallningsnr = Nyckel
Call TaBortFelaktigtRecord ’Ta bort felaktigt rekord och visa sista ”OK-rekordet”
Else
DoCmd.RunCommand acCmdRecordsGoToPrevious 'Visa föregående record
Exit Sub
End If
Private Sub TaBortFelaktigtRecord
'Ta bort felaktigt record
' Delete
' FROM Personer
' Where Anstallningsnr = Nyckel
’ Visa föregående record.
End Sub
Har svårt att få till rutinen ”TaBortFelaktigtRecord” .
Hoppas det finns någon som kan hjälpa mig på traven.
Mvh/ HarrySv: DELETA record
Det känns som om du nu skapar ett nytt record till db oavsett vad du skickar in för parametrar och då får du en konstig logik att hantera som du beskriver.
Om jag förstått dig rätt i detta så gör om hela förloppet och börja med att validera dina värden som kommer in. Om de är OK kan du skapa ett nytt record annars skicka upp ett felmeddelande.Sv:DELETA record
Du har alldeles rätt i ditt resonemang. Jag har bara inte kommit fram till hur jag skall lyckas validera innan recordet per automatik har skapats.
Jag använder nu "standard navigations knapparna (pilarna) i formuläret".
Automatiken med användning av pilarna är den att när rutan för ett nytt record dyker upp så är nyckelvärdet (räknaren) Null vilket är ok, men vid första "klickandet" på ett fält så skapas recordet trots att jag kanske inte skulle önska att så sker.
Samtidigt som jag nu skriver detta förstår jag att det ju är just det jag inte skall tillåta att sker genom att istället för att fylla i ett fält som är kopplat till DB enbart göra valideringen.
Det är ju så det skall lösas. TACK för hjälpen.
Skall genast prova, men du har alldeles rätt.
Tack än en gång. Jag hör av mig.
Mvh/ Harry
Som sagt var!! Tack för hjälpen. Allt är nu helt OK.
Ha en trevlig fortsättning på veckoslutet!!
(Jag var helt klart på väg över ån efter vatten). Du hejdade mig innan jag landade mitt i plurret.
Kan ändå inte låta bli att fråga hur SQL satsen skall se ut för att deleta ett rekord som jag via ett formulär bläddrat fram och kommit fram till att jag vill ta bort. ??Sv: DELETA record
Ang. din DELETE fråga: kanske vore detta en lösning?
Private Sub TaBortFelaktigtRecord
Dim iNyckelVarde
iNyckelVarde = Nyckel / 1000
If iNyckelVarde > 0 Then
oCon.Execute "Delete FROM Personer Where Anstallningsnr = Nyckel"
End If
End Sub
oCon är här ditt databasobjekt.Sv:DELETA record
Jag har mycket att ta igen. Det har gått många år sedan jag sysslade med programmering.
Må så gott! hälsar/ HarrySv: DELETA record
JanneSv:DELETA record
Har inte testat ditt tips, men det verkar ju som om även det hade löst mitt problem. Löste problemet enligt Peters variant genom att först kolla riktigheten i den nya posten innan jag skapade eller skippade.
Kanske jag kan ställa en ny (nu aktuell fråga) i denhhär samma tråden?
Avser att ge användaren som bläddrar genom ett antal poster även möjlighet att via en combobox välja fram sin post m.h.a. personnamnet i posten istället för enbart via navigationsknapparna(pilarna).
Så långt är allt ok. Via den nya comboboxen får användaren nyckelvärdet till den post som intresserar.
Så till nya problemet.
Tänkte att jag kunde överföra det aktuella nyckelvärdet från comboboxen via en "after_update" rutin till fältet med vars hjälp man direkt kan välja en ny post. Alltså fältet som ligger mellan navigationspilarna. Problemet är bara det att jag inte kan hitta namnet på det fältet(navigationsfältet).
Är inte det fältet kanske tillgängligt att nå via programrutin?
Verkar konstigt. Tror nog mer på att jag bara inte har lyckats hitta namnet på fältet.
Tacksam igen om någon har de rätta svaren.
mvh/ HarrySv: DELETA record
Rutinen använder sig av Me.Recordsource.
Private Sub cboPersoner_AfterUpdate()
Dim strNewRecord As String
strNewRecord = "SELECT * FROM Personer " _
& " WHERE Nyckel = '" _
& Me!cboPersoner.Value & "'"
Me.RecordSource = strNewRecord
End Sub
När jag kör programmet fastnar det på instruktionen Me.RecordSource = strNewRecord
med felmeddelandet: Körfel 2001 "Du avbröt föregående åtgärd"
Var är det som inte stämmer?Sv:DELETA record
Jag har här använt en tabell med fälten.
id, (räknare)
tidpunkt, (datum)
Beskr, (text)
Alla fälten visas i ett formulär, i formuläret har jag även en ComboBox (cmbSelect) där radkällan är
cmbSelect inställningar
Typ av radkälla : Tabell/Fråga
Radkälla : SELECT Tabell1.id, Tabell1.Beskr FROM Tabell1 ORDER BY Tabell1.Beskr;
Bunden kolumn : 1
Antal kolumner : 2
Kolumnbredder: 0 cm; x cm x = bredd som behövs för att texten ska synas
cmbSelect händelse
<code>
Private Sub cmbSelect_Change()
Me.Recordset.FindFirst ("id = " & Me.cmbSelect.Value)
End Sub
</code>
Du bör nog även komplettera koden med
<code>
Private Sub Form_AfterDelConfirm(Status As Integer)
Me.cmbSelect.Requery
End Sub
Private Sub Form_AfterInsert()
Me.cmbSelect.Requery
End Sub
Private Sub Form_AfterUpdate()
Me.cmbSelect.Requery
End Sub
</code>
cmbSelect har jag placerat i formulärets header
//
Janne