10. oktober 2002 - 21:30Der er
23 kommentarer og 1 løsning
Deklarering af en boolean udenfor en sub/function
hvordan tildeler man en boolean en værdi udenfor en sub/function? eks: private test as boolean test = true normalt kan man ikke gøre dette udenfor en sub/function er der en workaround til det? det nemlig en værdi som brugeren ikke kan ændre i på nogen måde. jeg kunen jo lave en metode, men så skal jeg kalde den metode hvergang jeg skal bruge min test og det synes jeg ikke er så smart. Jeg kunne jo lave en constant, men jeg ved ikke om man kan redimme sådan en? Husk brugeren må stadig ikke kunne ændre værdien af test.
Hmmmm....lige lidt nærmere forklaring.... Hvis der ikke er en rutine der kan ændre den kan brugeren heller ikke, ligger rutinen udenfor de funktioner brugeren har mulighed for at bruge så kan han heller ikke.......
Man kan ligge den i et bas modul, så kalde det ?
eller ligge den i basmodul og dimme den som global
Det er fordi det eneste der må ændre værdien af booleanen er det metoder hvor jeg kalder den. men den skal altid være true indtil at den bliver ændret i en metode, vel or mærket en metode som brugeren ikke har indflydelse på.
her er koden hvor jeg deklarere min boolean. Det er klasse som kun systemet har adgang til og ikke brugeren. det er et class module: kode ------------------------------------------------------------------------------ Option Explicit Private SQLmodA As New SQLmod Private ExchmodA As New Exchmod Private HistModA As New Histmod ' En instans af Historic modulet
Private wfStepRun As Boolean 'WFets pause variable, pauser indtil brugeren har godkendt det enkelte step wfStepRun = True <--- VÆRDI SAT og her kommer fejlen! Private wfRunning As Boolean 'WFets status, er det pauset eller køre det... bliver styrret af engine igennem manageren
Private wfSteps(antalWFsteps) As New WorkFlowStep 'tabel over de enkelte WF steps i WFet Private antOpWFSteps As Integer 'antal oprettede WF steps Private stepNr As Integer 'Det WF step som vi er kommet til
Private godkendt As Boolean 'WFet er gennemført uden afvisninger så true ellers false Private Afslut As Boolean 'WFet er afsluttet, flaget bliver sat når et WF når sidste step uanset om det er godkendt eller ej
Private projektnavn As String, projektID As Integer, filpath As String, filnavn As String
Friend Sub SetProjektID(projID As Integer) projektID = projID End Sub
Friend Function GetProjektID() As Integer GetProjektID = projektID End Function
Friend Sub SetProjektnavn(navn As String) projektnavn = navn End Sub
Friend Function GetProjektnavn() As String GetProjektnavn = projektnavn End Function
Friend Sub SetFilnavn(file As String) filnavn = file End Sub
Friend Function GetFilnavn() As String GetFilnavn = filnavn End Function
Friend Sub SetPath(sti As String) filpath = sti End Sub
Friend Function GetPath() As String GetPath = filpath End Function
Friend Sub SetGodkendt(valg As Boolean) godkendt = valg End Sub
Public Function GetGodkendt() As Boolean GetGodkendt = godkendt End Function
Public Sub SetAfslut(valg As Boolean) Afslut = valg End Sub
Public Function GetAfslut() As Boolean GetAfslut = Afslut End Function
Public Sub SetRunning(valg As Boolean) wfRunning = valg End Sub
Public Function GetRunning() As Boolean GetRunning = wfRunning End Function
Public Sub SetStepRun(valg As Boolean) wfStepRun = valg End Sub
Public Function GetStepRun() As Boolean GetStepRun = wfStepRun End Function
Public Sub SetWFStep(brugerID As String, opg As Integer, adgang As Integer, dato As Date, tid As Date) wfSteps(antOpWFSteps).SetBrugerID (brugerID) wfSteps(antOpWFSteps).SetOpgave (opg) wfSteps(antOpWFSteps).SetAdgang (adgang) Call wfSteps(antOpWFSteps).SetDeadline(dato, tid) antOpWFSteps = antOpWFSteps + 1 End Sub
Public Sub RunWFStep() Dim rs As ADODB.Recordset Dim fldLoop As ADODB.Field Dim nr, i As Integer Dim str, s As String nr = 0 If wfRunning = True And wfStepRun = True Then Call SQLmodA.SQLConn Set rs = SQLmodA.rsSelect("SELECT * FROM t_Steps WHERE ProjID = " & projektID) If rs.BOF = True And rs.EOF = True Then SQLmodA.rsExecute ("INSERT INTO t_Steps (ProjID, StepNR) VALUES (" & projektID & ", 1)") SQLmodA.Disconnect nr = 0 Else Set rs = SQLmodA.rsSelect("SELECT * FROM t_Steps WHERE ProjID = " & projektID) For Each fldLoop In rs.Fields Select Case fldLoop.Name Case "StepNR" nr = fldLoop.Value End Select Next fldLoop i = nr + 1 SQLmodA.rsExecute ("UPDATE t_Steps SET StepNR = " & i & " WHERE ProjID = " & projektID) SQLmodA.Disconnect End If
If nr < antOpWFSteps Then If wfSteps(nr).GetOpgave = 1 Then str = startBody & ExchmodA.hentUser(wfSteps(nr).GetBrugerID) & midBody1 & slutbody1 & wfSteps(nr).GetDeadlineDato & " " & wfSteps(nr).GetDeadlineTid wfStepRun = False
s = "Der er sendt besked til " & ExchmodA.hentUser(Godkender) & ", med besked om at godkende eller afvise projektet" Call HistModA.SaveHistoric(projektID, str) Else str = startBody & ExchmodA.hentUser(wfSteps(nr).GetBrugerID) & midbody2
s = "Der er sendt besked til " & ExchmodA.hentUser(Godkender) & ", med besked om at gennemlæse projektet" Call HistModA.SaveHistoric(projektID, str) End If Call ExchmodA.sendmail(projektnavn, wfSteps(nr).GetBrugerID, str, filpath, filnavn) Else wfRunning = False Afsluttet (True) End If End If End Sub Public Sub RunGodkend(Godkender As Integer) Dim str As String SetStepRun (True)
str = "Projektet er godkendt af " & ExchmodA.hentUser(Godkender) Call HistModA.SaveHistoric(projektID, str) End Sub
Public Sub RunAfvis(Afviser As Integer) Dim rs As ADODB.Recordset Dim fldLoop As ADODB.Field Dim nr, i As Integer Dim str As String
Call SQLmodA.SQLConn i = antOpWFSteps nr = antOpWFSteps - 1 SQLmodA.rsExecute ("UPDATE t_Steps SET StepNR = " & i & " WHERE ProjID = " & projektID) SQLmodA.Disconnect
str = "Projektet er afvist af " & ExchmodA.hentUser(Afviser) Call HistModA.SaveHistoric(projektID, str) End Sub
Private Sub Afsluttet(godk As Boolean) Afslut = True godkendt = godk SQLmodA.SQLConn If godk = True Then SQLmodA.rsExecute ("UPDATE t_object SET Godkendt = 1, Afslut = 1 WHERE ID = " & projektID) Else SQLmodA.rsExecute ("UPDATE t_object SET Godkendt = 0, Afslut = 1 WHERE ID = " & projektID) End If SQLmodA.Disconnect End Sub ---------------------------------------------------------------------------
som du kan se bliver wfStepRun brugt mange steder og inden at den bliver ændret til false skal der være true. F.eks. her henter jeg værdien på wfstepRun ud Public Function GetStepRun() As Boolean GetStepRun = wfStepRun End Function hvis den ikke er ændret til noget andet er den true som der står aller øverst i koden. Det er for at undgå at wfStepRun heletiden er true indtil det bliver ændret. Og den værdien ad wfStepRun skal kun kunne nås i denne klasse og ikke andre steder men her skal værdien være sat inden den bliver brugt.
ok.. det havde jeg tænkt på, men det var for at slippe for at skulle kalde en masse ekstra ting. Det var for slipep for at skullel lave en masse ekstra arbejde. Du ved dovernskab. Jeg har tænkt på lave et modul bare med den her variabel i og kalde den, men den er jo ikke helt private så.
nej så er den global, men det giver det samme som at dimme den i en form, det du skal er du skal lave en rutine/metode i et basmodul og dimme din variabel som private
Altså
Private test as boolean
så er det kun dit modul der har adgang til den....og så kalde rutinen andre steder fra....
Lige for at være lidt nysgerrig hvad er det så den service skulle kunne ?
ok.. det er det jeg har overvejet og det var det jeg ville undgå. Det lader til at det er den eneste udvej. ok det er en længere historie. hehe. Er igang med at lave hovedopgave som Datamatiker og har en opgave der går ud på at lave et dokument styrings system bygget på MSSQL2000 og Exchange 2000. I alt sin enkelthed skal denne service styre at et dokument kommer rundt i en arbejdsgang (workflow). DVS at en bruger opretter et projekt. Lad os sige et programmerings projekt også definerer han en liste over hvem der deltgaer i dette projekt og hvornår de enkelte programmøre skal udføre deres del af opgave. Det er det vores service skal styre. At få sendt det rigtigt rundt og se hvilke workflows der kører hvilke der ikke kører og om en deltager har udført sin opgave inden for tidsgrænsen osv. Jeg ved ikke om det fik noget ud af at læse det, men det er det, det skal bruges til.
Det er sådan set derfor det bliver lavet i VB6. Hvis jeg skulle lavet det selv havde jeg nok valgt Java det er langt mere overlegent hvad angår typer, men sådan er vilkårene nu engang.
en anden grund til at det bliver lavet i VB er at det kræver virksomheden simpelthen vi kunne også lave det i C/C++ men der satte vi en grænse. Vi skulle bare komme med en skabelon, som det kunne gå videre med.
Men ud fra det jeg har læst skulle du kunne dimme den normalt i den form du har lavet, for er der ikke en rutine som brugeren har adgang til som ændre den så kan brugeren ikke ændre den.....
Niks ikke noget sted. Det der sker er at når en bruger har fået et dokument bliver wfStepRun sat til false, for at indikere at nu er den ved den næste deltager. På en måde har brugeren indirekte adgang til at ændre wfStepRun. Når deltageren så er færdig med sin del af opgave bliver wfStepRun sat true igen for nu kører porjektet igen indtil den når næste bruger.
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.