أي شخص يمكن أن توفر ردود الفعل على LotusScript العميل ؟
-
22-07-2019 - |
سؤال
مرحبا هناك أنا لست المطور و أنا على علم أفضل الممارسات.أنا خلقت هذا إلى تجاوز البيانات يدويا نسخ من بيانات السجل.هذا العامل هو واحد العلف الذي سوف نسخ وضبط كل واحدة إضافية.المحدد تغذية يقرأ سجل للمرة الأخيرة معالجة عدد من الملفات معالجتها حتى اليوم و أمس.وتعول أيضا الملفات في إدخال مجلد يقرأ ملقم التوقيت.كل بند من بنود البيانات مفصولة بفاصلة csv و البريد التي يتم استضافتها على الموقع.شكرا على أي نقد بناء.
Sub Initialize
Dim customername As String
Dim servername As String
Dim feedname As String
Dim alertthresholdinhours As Integer
Dim inputfeedpath As String
' Set for each feed
customername = "gRrhio"
servername = "gRrhioEdge2"
feedname = "FF Thompson ADT"
alertthresholdinhours = 6
inputfeedpath = "\\mhinec\elycon\data\adt\*.*"
' Counts files in input folder
Dim pathName As String, fileName As String
Dim inputfeedcounter As Integer
inputfeedcounter = 0
pathName$ = inputfeedpath
fileName$ = Dir$(pathName$, 0)
Do While fileName$ <> ""
inputfeedcounter = inputfeedcounter + 1
fileName$ = Dir$()
Loop
Dim entry As NotesViewEntry
Dim vc As NotesViewEntryCollection
Dim filesprocessed As Integer
Dim session As New NotesSession
Dim db As NotesDatabase
Dim newDoc As NotesDocument
Dim rtitem As NotesRichTextItem
Set db = session.CurrentDatabase
Dim view As NotesView
Set view = db.GetView( "Sessions\by Feed" )
Set newDoc = New NotesDocument( db )
Set rtitem = New NotesRichTextItem( newDoc, "Body" )
Dim todaysdate As New NotesDateTime("Today")
Dim flag As Integer
Dim counter As Integer
Dim files As Integer
Dim errors As Integer
Dim lastdate As String
Dim lastdayran As String
Dim lasttime As String
Dim lasttimeran As String
Dim filesp As Integer
Dim lastdayfiles As Integer
Dim lastdaysfiles2 As Integer
Dim terrors As Integer
Dim lastdayerrors As Integer
lastdate = ""
lastdayran = ""
counter = 0
flag = 0
filesp = 0
lastdayfiles = 0
lastdaysfiles2 = 0
terrors = 0
lastdayerrors = 0
' Finds date for last time processed, counts files processed and errors
While flag = 0
Dim dateTime As New NotesDateTime(todaysdate.DateOnly)
Dim keyarray(1) As Variant
keyarray(0) = feedname
Set keyarray(1) = dateTime
Set vc = view.GetAllEntriesByKey(keyarray, False)
Set entry = vc.GetFirstEntry
If entry Is Nothing Then
Call todaysdate.AdjustDay(-1)
End If
While Not entry Is Nothing
files = 0
Forall colval In entry.ColumnValues
If counter = 9 Then
counter = 0
Elseif counter = 8 Then
counter = 9
Elseif counter = 7 Then
counter = 8
Elseif counter = 6 Then
errors = Cint(colval)
counter = 7
Elseif counter = 5 Then
counter = 6
Elseif counter = 4 Then
files = Cint(colval)
counter = 5
Elseif counter = 3 Then
counter = 4
Elseif counter = 2 Then
counter = 3
lasttime = colval
Elseif counter = 1 Then
counter = 2
lastdate = colval
Elseif counter = 0 Then
counter = 1
End If
End Forall
filesp = filesp + files
terrors = terrors + errors
Set entry=vc.GetNextEntry (entry)
flag = 1
Wend
Wend
lastdayfiles = filesp
lastdayerrors = terrors
lastdayran = lastdate
lasttimeran = lasttime
'Counts previous files processed
filesp = 0
terrors = 0
lastdate = ""
flag = 0
Call todaysdate.AdjustDay(-1)
While flag = 0
Dim dateTime2 As New NotesDateTime(todaysdate.DateOnly)
Dim keyarray2(1) As Variant
keyarray2(0) = feedname
Set keyarray2(1) = dateTime2
Set vc = view.GetAllEntriesByKey(keyarray2, False)
Set entry = vc.GetFirstEntry
If entry Is Nothing Then
Call todaysdate.AdjustDay(-1)
End If
While Not entry Is Nothing
files = 0
Forall colval In entry.ColumnValues
If counter = 9 Then
counter = 0
Elseif counter = 8 Then
counter = 9
Elseif counter = 7 Then
counter = 8
Elseif counter = 6 Then
counter = 7
Elseif counter = 5 Then
counter = 6
Elseif counter = 4 Then
files = Cint(colval)
counter = 5
Elseif counter = 3 Then
counter = 4
Elseif counter = 2 Then
counter = 3
Elseif counter = 1 Then
counter = 2
Elseif counter = 0 Then
counter = 1
End If
End Forall
filesp = filesp + files
Set entry=vc.GetNextEntry (entry)
flag = 1
Wend
Wend
lastdaysfiles2 = filesp
' Prints line of CSV into body of email
Call rtitem.AppendText ( customername )
Call rtitem.AppendText ( ", " )
Call rtitem.AppendText ( servername )
Call rtitem.AppendText ( ", " )
Call rtitem.AppendText ( datetime.timezone )
Call rtitem.AppendText ( ", " )
Call rtitem.AppendText ( lastdayran )
Call rtitem.AppendText ( " " )
Call rtitem.AppendText ( lasttimeran )
Call rtitem.AppendText ( ", " )
Call rtitem.AppendText ( lastdayfiles )
Call rtitem.AppendText ( ", " )
Call rtitem.AppendText ( lastdayerrors )
Call rtitem.AppendText ( ", " )
Call rtitem.AppendText ( lastdaysfiles2 )
Call rtitem.AppendText ( ", " )
Call rtitem.AppendText ( inputfeedcounter )
Call rtitem.AppendText ( ", " )
Call rtitem.AppendText ( alertthresholdinhours )
Call newDoc.Save( False, True )
newDoc.Subject = feedname
' Running from server line should be
'newDoc.SendTo = "Ecmon Feedcheck/Ecmonitor@ECMONITOR"
newDoc.SendTo = "AX1Forward Feedcheck/ACHQ@company.com"
newDoc.Send( False )
End Sub
المحلول
لعدم مطور، يمكنك كتابة الكثير من التعليمات البرمجية:)
إذا كنت تبحث عن بعض الدروس لبدء تصبح مطور جيدة، ثم تأخذ المشورة ميتش (من تعليق) وتفريق هذا إلى الوظائف الفرعية. الدرس 1: هناك بالتأكيد بعض التعليمات البرمجية repetitve هنا، وانها دائما فكرة جيدة لوضع التعليمات البرمجية المتكررة إلى أسلوب (وظيفة أو روتين) لذلك لا يوجد إلا مرة واحدة. المقطع الذي يهم تجهيز الملفات والملفات السابقة المجهزة مشابها وربما يكون من الممكن وضع في روتين مثل:
Function GetCountFilesProcessed() As Integer
'code here
End Function
ولكن، حتى أنك قد تكون قادرة على انقاذ الحاجة لذلك إذا أنا فهم التعليمات البرمجية بشكل صحيح. بدلا من القيام بذلك حلقة غريبة في الوسط، يبدو أنك تحاول ببساطة الحصول على قيمة من عمود viewentry. يقولون ان interetsed لكم في قيمة العمود 4 ل. يمكنك ببساطة الحصول على قيمة العمود الذي تريد عن طريق الوصول إليه بواسطة مؤشر. على سبيل المثال، يمكن وضع ملفات متغير مباشرة إلى قيمة العمود 4 عن طريق هذا الخط
files = Cint(entry.ColumnValues(4)) 'check this, it might be 3 if the array is zero based.
وعلى أي حال، خلاصة القول إذا كان يعمل هذا الكود ثم كنت خارج لبداية جيدة!
نصائح أخرى
على أكثر من نمط الجانب من الأمور, لطالما وجدت أنه من الأسهل للحفاظ على رمز الآخرين عندما
- أعلن
Option 'Explicit'
في مقطع Declarations - المتغيرات من ما يقرب من أعلى إلى أسفل (على سبيل المثال ، قبل db قبل عرض قبل doc)
- مسبوقة الملاحظات الكائنات مع نوع (docMail, dbMyDatabase, viewOutstandingInvoices)
- وضع كل من الإعلانات في أعلى قبل (يساعد على إيجاد الإعلان عندما كنت تأتي عبر متغير)
- كما ذكر آخرون ، تقسيمها إلى وظائف/subs حيثما ينطبق ذلك.
تعليقك حول نسخ هذا وكيل حالات أخرى من نفس المشكلة أيضا يرفع العلم.في محاولة للعمل على ما هو مشترك بين هذه العوامل تدفع تلك الوظائف في مكتبة البرنامج النصي.هذا النوع من الشيء يوفر الكثير من الوقت عند صيانة الكود كما أنت لا تحتاج إلى التفكير في ما هي الطريقة كل عميل مختلفة (على سبيل المثال.لا تغيير تنطبق على جميع الحالات من هذا العامل ، أو فقط بعض منهم؟)
وأنت تريد أن تتحلل التعليمات البرمجية الخاصة بك أكثر من ذلك بكثير و... شيء واحد صغير. بدلا من
while not item is nothing
والذي هو نفي مزدوج وبندر الدماغ شعبية .. الكتابة:
do until item is nothing
...
loop
وهذا أيضا يسمح لك للخروج من الحلقة مع خروج تفعل
ويمكنك تحسين كل من الحلقات فورال الخاص بك. هذه هي الطريقة التي تعد الأولى من نوعها ستبحث:
Forall colval In entry.ColumnValues
Select Case (counter)
Case 1: lastdate = colval
Case 2: lasttime = colval
Case 4: files = Cint(colval)
Case 6: errors = Cint(colval)
End Select
counter = (counter + 1) Mod 10
End Forall
وهذه هي الطريقة الثانية يمكن للمرء ستبدو:
Forall colval In entry.ColumnValues
if (counter = 4) Then files = Cint(colval)
counter = (counter + 1) Mod 10
End Forall
فقط ملاحظة بخصوص هذا الشيء
While Not entry Is Nothing
files = 0
Forall colval In entry.ColumnValues
If counter = 9 Then
counter = 0
Elseif counter = 8 Then
counter = 9
....
كما يقول كين يمكنك الحصول على columnValues باستخدام الإدخال.ColumnValues(x) طريقة لذلك interating من خلال القيم الامم المتحدة الحاجة.ولكن ؛ كنت قد فعلت هذا
While Not entry Is Nothing
files = 0
counter = 0
Forall colval In entry.ColumnValues
counter = counter + 1
Select case counter
case 6
errors = Cint(colval)
.....
end select
وبعض النقاط الجيدة بالفعل. لإضافة لهم إذا كان لديك المتغيرات التي تشترك في موضوع مشترك ثم إنشاء فئة. إضافة المتغيرات الخاصة بك لتلك الفئة.
وذلك بدلا من القول:
Dim userFullName as String
Dim age as Integer
Dim addressLine1 as String
' ... etc.
هل يمكن أن يكون:
Class UserDetails
Dim fullName as String
Dim age as Integer
Dim addressLine1 as String
' ... etc
End Class
ووالمرجعية:
Dim u as new UserDetails
u.fullName = "full name"
u.age = 22
u.addressLine1 = "1 main street"
وميزة هذا هو يمكنك إضافة أساليب لمعالجة تلك البيانات وكنت تعرف رمز يتعلق هذا الكائن بدلا من الصيد من خلال التطبيق الخاص بك.