0

私はこれに取り組んできました...しかし、なぜそれが機能するのかわかりません

ドロップダウンリストがあり、選択すると値が設定されますが、うまくいきました...

しかし、その値を別のサブルーチンに表示したい場合、表示されませんか?

私を助けてください ?

そして、コードを特定の方法で書く必要がある場合は、私に知らせてください...私はインターネットから学んでいるので、適切に「訓練」されていません....

<html>
<head>
<title>Break Logs</title>

<HTA:APPLICATION

icon=icon.ico
    singleinstance="yes"
border="thin"
borderStyle="normal"
caption="yes"
maximizeButton="no"
minimizeButton="no"
showInTaskbar="yes"
windowState="normal"
innerBorder="yes"
navigable="no"
scroll="no"
scrollFlat="no"
sysMenu="yes"
>

</head>

<SCRIPT Language="VBScript">

Window.ResizeTo 250, 250

Dim objFSO, wshShell, strUser, Name, LastName, strLogs, strLogFile, strLocation


'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'       GETTING USERS NAME FROM AD  THIS IM NOT USING WHEN AT HOME TESTING...
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
sub asdf

Set wshShell = CreateObject("WScript.Shell")
strUser = wshShell.ExpandEnvironmentStrings("%USERNAME%")
Const ADS_SCOPE_SUBTREE = 2
Set objRootDSE = GetObject("LDAP://RootDSE")
strDomain = objRootDSE.Get("DefaultNamingContext")
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand = CreateObject("ADODB.Command")
Set objCommand.ActiveConnection = objConnection
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
objCommand.CommandText = "SELECT distinguishedName FROM 'LDAP://" & strDomain & "'                 WHERE objectCategory='User' AND samAccountName = '" & strUser & "'"
Set objRecordSet = objCommand.Execute
If Not objRecordSet.EOF Then
strDN = objRecordSet.Fields("distinguishedName").Value
End If
Set MyUser = GetObject ("LDAP://" & strDN)
Name = myUser.GivenName
LastName = myUser.sn

end sub

Name = "Pavle"
LastName = "Stojanovic"

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'       SETTING TITLEBAR NAME
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
document.title = "Break Logs For " & Name & " " & LastName

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
CONST ForAppending = 8

Set objFSO = CreateObject("Scripting.FileSystemObject")

strLocation = "F:\"
strLogFile = "Late Breaks.txt"

If Not objFSO.FileExists(strLocation & strLogFile) Then
   objFSO.CreateTextFile(strLocation & strLogFile)
End If



Sub Breaks

MorningBreak = (" - Morning Break " & Name & " was late: " & _ 
        HowLate.Value & " Minutes" & vbCrLf & _
    " - Reason: " & Reason.Value & vbCrLF & _
    " - Date Entered: " & Now())


LunchBreak = (" - Lunch Break " & Name & " was late: " & _ 
        HowLate.Value & " Minutes" & vbCrLf & _
    " - Reason: " & Reason.Value & vbCrLF & _
    " - Date Entered: " & Now())

AfternoonBreak = (" - Afternoon Break " & Name & " was late: " & _ 
        HowLate.Value & " Minutes" & vbCrLf & _
    " - Reason: " & Reason.Value & vbCrLF & _
    " - Date Entered: " & Now())

RNA = (" - Ring No Answer Logged By " & Name & vbCrLF & _
   " - On Date: " & Now() & vbCrLF & _ 
   " - Reason: " & Reason.Value)


Other = (" - Date Entered: " & Now() & vbCrLf & _ 
 " - Reason: " & Reason.Value)



If DropDown.Value = 1 Then

' Nothing to be done in this option...

ElseIf DropDown.Value = 2 Then

BreakCode = MorningBreak

ElseIf DropDown.Value = 3 Then

BreakCode = LunchBreak

ElseIf DropDown.Value = 4 Then

BreakCode = AfternoonBreak

ElseIf DropDown.Value = 5 Then

BreakCode = RNA

ElseIf DropDown.Value = 6 Then

BreakCode = Other

Else

MsgBox "Something went wrong, this option shouldn't popup"

End If


' If I do MsgBox to display BreakCode it works here before leaving the sub ?
End Sub



Sub Submit

MsgBox BreakCode ' this doesnt show up and below wont write to text ???

Set strLogs = objFSO.OpenTextFile(strLocation & strLogFile, ForAppending, True)
    strLogs.WriteLine BreakCode & vbCrLf
     strLogs.Close

End Sub



</SCRIPT>
<body bgColor="LightSteelBlue">

<select size="1" name="DropDown" onChange="Breaks">
 <option value="1">Choose Break</option>
  <option value="2">Morning Break</option>
    <option value="3">Lunch Break</option>
     <option value="4">Afternoon Break</option>
      <option value="5">Ring No Answer</option>
       <option value="6">Other</option>
        </select>

<BR>
<BR>

Reason:
<BR>
<input type="text" name="Reason" size="10" style="width:200">

<BR>
<BR>

Minutes Late:
<BR>
<input type="text" name="HowLate" size="10"> 

<BR>
<BR>
<input type="button" value="Submit" onClick="Submit" title="Added Reason for being late.">

</body>
</html>
4

2 に答える 2

2

BreakCode変数をどこにも明示的に定義しないので、スクリプト エンジンは変数が使用されているスコープ内で自動的に変数を定義します。したがって、2 つの変数がありBreakCodeます。1 つはプロシージャー内Breaksにあり、もう 1 つはプロシージャー内にありますSubmit。後者には値が割り当てられないため、空のままです。

行を挿入する

Dim BreakCode

この行の後:

Dim objFSO, wshShell, strUser, Name, LastName, strLogs, strLogFile, strLocation

そして問題は消えます。

于 2013-01-22T18:00:18.097 に答える
0

@Ansgarは、このコード(+1)で1つのエラーを見つけたことで明らかに称賛に値します。あなたがそれをきれいな「解決策」と比較するならば:

HTA:

<html>
 <head>
  <title>Break Logs</title>
  <hta:application
   id="breaks"
   scroll="no"
  ></hta>
  <script type="text/vbscript" src="breaks.vbs"></script>
 </head>
 <body bgColor="LightSteelBlue">
  <form>
   <select size="1" name="DropDown">
    <option value="1">Choose Break</option>
    <option value="2">Morning Break</option>
    <option value="3">Lunch Break</option>
    <option value="4">Afternoon Break</option>
    <option value="5">Ring No Answer</option>
    <option value="6">Other</option>
   </select>
   <br />
   <br />
   Reason:
   <br />
   <input type="text" name="Reason" size="10" style="width:200">
   <br />
   <br />
   Minutes Late:
   <br />
   <input type="text" name="HowLate" size="10">
   <br />
   <br />
   <input type="button" value="Save" onClick="SaveIt" title="Added Reason for being late.">
  </form>
 </body>
</html>

VBS:

Option Explicit

Const ForAppending = 8
Const csFSpec      = "wherever"

Window.ResizeTo 250, 250

Dim sFstName : sFstName = "Pavle"
Dim sLstName : sLstName = "Stojanovic"
document.title = "Break Logs For " & sFstName & " " & sLstName

Sub SaveIt
  Dim nOpt : nOpt = CInt(document.all.DropDown.Value)
  If nOpt <> 1 Then
     Dim sReason  : sReason  = Trim(document.all.Reason.Value)
     Dim sHowLate : sHowLate = Trim(document.all.HowLate.Value)
     Dim sBreak   : sBreak   = document.all.DropDown.options(nOpt - 1).text
     If sReason <> "" And sHowLate <> "" Then
        Dim sLog   : sLog       = Join(Array( _
              "- " & sBreak & " " & sFstName & " was late" _
            , "- Minutes:      " & sHowLate _
            , "- Reason:       " & sReason _
            , "- Date Entered: " & Now() _
         ), vbCrLf)
        MsgBox sLog
        Dim oFS    : Set oFS    = CreateObject("Scripting.FileSystemObject")
        Dim tsLogs : Set tsLogs = oFS.OpenTextFile(csFSpec, ForAppending, True)
        tsLogs.WriteLine sLog
        tsLogs.Close
     Else
        MsgBox "Fill in Reason and HowLate!"
     End If
  Else
     MsgBox "Choose break type!"
  End If
End Sub

あなたは他のものを簡単に拾うことができます:

  1. 悪いHTML:との間、なし(tidyのようなバリデーターを使用する必要があります)
  2. 送信とは、サーバーに送信することを意味します。.HTAには意味がありません
  3. ドロップダウンがチャンスを選択するときにReasonとHowLateを選択することは無意味です(通常、ユーザーは後でそれらを入力します)。実際、DopDownはそれ自体で選択の変更を非常にうまく処理できます
  4. ユーザーがをクリックすると、興味深いことがすべて起こりますSave。したがって、グローバル変数はまったく必要ありません
  5. OpenTextFile(,,True)存在しないファイルが作成されるため、ログファイルの存在を確認する必要はありません。

そして、あなたは中心的な欠陥に集中することができます:

  1. これを本番環境で使用することはできません。複数のユーザーがいるとすぐに、ユーザーが同時に押してログファイルを壊してしまうためです。Save
于 2013-01-22T20:51:27.130 に答える