Monday, December 14, 2015

Life is a Gift



Today before you think of saying an unkind word-

think of someone who can't speak.


Before you complain about the taste of your food-

think of someone who has nothing to eat.


Before you complain about your husband or wife-

think of someone who is crying out to God for a companion.


Today before you complain about life-

think of someone who went too early to heaven.


Before you complain about your children-

think of someone who desires children but they're barren.


Before you argue about your dirty house, someone didn't clean or sweep-

think of the people who are living in the streets.


Before whining about the distance you drive-

think of someone who walks the same distance with their feet.


And when you are tired and complain about your job-

think of the unemployed, the disabled and those who wished they had your job.


But before you think of pointing the finger or condemning another-

remember that not one of us are without sin and we all answer to one maker.


And when depressing thoughts seem to get you down-

put a smile on your face and thank God you're alive and still around.



Life is a gift. Live it, Enjoy it, Celebrate it, and Fulfill it.

Thursday, December 10, 2015

Beginning OOP with C#


This is my reading book to know about OOP Fundamental with C#. You will not get bored when reading this book. Jack Purdum has unique style on writing this book :)

Sams Tech Yourself C# in 21 Days


This is an old book but it's a good start reading about C# Fundamental

Sunday, December 6, 2015

Cashier Checkout Light

Finally, Cashier Checkout Light project is implemented and Go Live successfully on big Event in December 2015. The Cashier Checkout Light is integrated with LS Retail. There are 58 POS machines are using the light.

Green Light --> Cashier is ready to serve Customer
Red Light --> Cashier needs help/support
No Light --> Cashier is serving Customer

Green Light will be automatically triggered once the transaction is done. There is also a timer to blink the light and to trigger after certain seconds.





Wednesday, November 18, 2015

MsComm32 with error "Port already Open" on Windows XP

I post this article as I can't find the solution on Internet. I hope this article can help anybody who has same issue with me.

Few days ago, I had an issue to send output to Werma LED light on Windows XP. It works perfectly on Windows 7. I can say that Windows XP is more fussy than Windows 7. I need to change few codes to fit to Windows XP's requirement.

One of the issue when trigger the light by using mscomm32.ocx is that the light will turn ON on the first time and can't be turned ON afterward. If you try to keep turning ON the light, there is error 8005 - Port already Open.

Trying to turn ON and OFF the light from Hyperterminal and Putty is OK. After further investigation and helped from other colleagues, we found out that Windows XP can't accept Carriage Return and Line Feed. It only accept Carriage Return on output command. Windows 7 can accept and work perfectly.

Windows XP
Chr := 13;
CRLF := FORMAT(Chr);

...
mscomm. Output = 'WR 00 01 01 64' + CRLF;

...


Windows 7
Chr := 13;
CRLF := FORMAT(chr);
Chr := 10;
CRLF := CRLF + FORMAT(Chr)

...
mscomm. Output = 'WR 00 01 01 64' + CRLF;

...

Windows 7 can accept both type of above coding :)

Thursday, November 5, 2015

Serial Port - PuTTY - VBScript - Werma LED Beacon Multicolour

On this session, I would like to give a documentation of my mini project. There are few ways to communicate with serial port. you may use HyperTerminal, PuTTY, or other applications.

At the moment, I focus on PuTTY to communicate with Serial Port (WERMA LED). Instead of running PuTTY and trigger commands manually to LED, I create a script in VBScript to trigger it.

This sample script will turn on BLUE colour of LED for one second and will turn off the LED afterward. I also add a function how to get the correct port dynamically regardless any port you have plug the LED in your PC.

Option Explicit
On Error Resume next 

Dim oshell
Dim PortNum

Set oshell = createobject("Wscript.Shell") 
oshell.run "cmd.exe"
Wscript.sleep 200

PortNum = GetPortNumber
Wscript.sleep 200

If PortNum = "INVALID" Then
  Wscript.sleep 200
  oshell.sendkeys "exit"+ ("{Enter}")
Else
  oshell.Run("putty.exe -serial" + " " + PortNum + " " + "-sercfg 9600,8,n,1,N") 
  Wscript.sleep 200
  oshell.sendkeys "WR 00 01 01 64" + ("{Enter}")     ' WR 00 RR GG BB <CR>
  Wscript.sleep 1000
  oshell.sendkeys "WR 00 01 01 01" + ("{Enter}")
  Wscript.sleep 200
  oshell.sendkeys "%" + ("{F4}")
  Wscript.sleep 200
  oshell.sendkeys ("{Enter}")
  Wscript.sleep 200
  oshell.sendkeys "exit"+ ("{Enter}")  
End If

Set oshell = nothing

Function GetPortNumber()
  Dim objShell
  Dim I
  Dim WermaPortFound
  Dim skey
  Dim skey2
  Dim InstanceID
  Dim PortName
  Dim WERMAPVID

  WERMAPVID = "VID_04B4&PID_E00A"
  
  Set objShell = WScript.CreateObject("WScript.Shell") 
  I = 0
  with CreateObject("WScript.Shell")
    Do Until WermaPortFound OR (I = 15)
      
      InstanceID = " "
      PortName = " "
      WermaPortFound = FALSE
  
      skey = "HKLM\SYSTEM\CurrentControlSet\Services\usbser\Enum\" + Cstr(I) 
      On Error Resume Next       
      InstanceID = .regread(sKey)     
      
      If (InstanceID <> " ") AND (InStr(UCase(InstanceID),UCase(WERMAPVID)) > 0) Then
        skey2 = "HKLM\SYSTEM\CurrentControlSet\Enum\" + InstanceID + "\Device Parameters\PortName"   
        On Error Resume Next 
        PortName = .regread(sKey2)
        
        If (PortName <> " ")  AND (InStr(UCase(PortName),"COM") > 0)Then 
          WermaPortFound = (Err.number = 0)
        End If

      End If

      I = I + 1
    Loop
  End with


  If WermaPortFound Then
     GetPortNumber = PortName
  Else
     GetPortNumber = "INVALID" 
  End If
  
  Err.Clear
  Set objShell = nothing

End Function

Sunday, November 1, 2015

AutoHotKey - Windows on Top



I created simple application to support Point of Sales application by using AutoHotKey open source application. It's easy to learn and implement. The point of my simple application is that I want to make a form to be on top of others windows form on the desktop. In my case, "a form" is run by RunCommand.exe. By creating this simple script, compile it into executable file (.exe), and put it on windows startup folder, it will run and force "a form" to be on top of other window forms.

Simple and pretty cool !


AutoHotKey script:

#Persistent
SetTimer, WatchExistXButtonWindow, 500
return

WatchExistXButtonWindow:
if WinExist("ahk_exe C:\RunCommand.exe")
{  
    WinSet, AlwaysOnTop, ON, ahk_exe C:\RunCommand.exe
}
return

To know more about AutoHotKey : http://autohotkey.com/

.NET Framework in Concise


Sunday, September 6, 2015

How to get RGB Value from Decimal Value

There is a powerful OCX from LS Retail Tool to convert Decimal Value to get RGB Value.

By using this OCX, we dont need to convert Decimal Value to Hexadecimal value. Afterward, convert Hexadecimal Value to get RGB Value :) :) :)



gToolsOcx ==> OCX ==> LSTools Control

[LONG GetColorRGB :=] gToolsOcx.GetColorRGB(LONG colorref, VAR LONG r, VAR LONG g, VAR LONG b)

Decimal to Hexadecimal



This is a sample code how to convert Decimal to Hexadecimal

Dec2Hex(DecValue : Decimal) : Text[6]
//Sample DecValue : 16422450
//16422450 MOD 16 = 1026403 --> 2
//1026403  MOD 16 = 64150   --> 3
//64150    MOD 16 = 4009    --> 6
//4009     MOD 16 = 250     --> 9
//250      MOD 16 = 15      --> 10 (A)
//15       MOD 16 = 15      --> 15 (F)
// -------------------------------------> FA9632

i := 1;
WHILE(DecValue <> 0) DO BEGIN
  Value := DecValue MOD 16;
  CASE Value OF
    10: Hex[i] := 'A';
    11: Hex[i] := 'B';
    12: Hex[i] := 'C';
    13: Hex[i] := 'D';
    14: Hex[i] := 'E';
    15: Hex[i] := 'F';
    ELSE Hex[i] := FORMAT(Value);
  END;
  DecValue := DecValue DIV 16;
  i += 1;
END;

FOR i := 6 DOWNTO 1 DO BEGIN
  IF Hex[i] = '' THEN Hex[i] := FORMAT(0);
  ResultHex += Hex[i];
END;

EXIT(ResultHex);

Wednesday, September 2, 2015

Motivation Quote


Read COM Port Dynamically by reading Windows Registry



I encounter issue when I try to develop integration between a Device and Navision by using Microsoft Communications Control, version 6.0.

This OCX tools need specific COM Port number information before opening the port. When the Device connect to USB port, system will assign COM Port number. Normally fixed COM Port number.

CRLF[1] := 13;
CommCtrl.CommPort := 8; // This is Fixed COM Port number
CommCtrl.Settings := '9600,n,8,1';
CommCtrl.InputMode := 0;    // 0 - Text mode, 1 - Binary
CommCtrl.PortOpen := TRUE;
CommCtrl.Output := <your command to Device> + CRLF;

If you have many USB Port, you plug the Device to any port you want. The problem is that every time we plug to certain port, system will assign new COM Port number. For example, you have 2 USB Port on your PC, USB port 1 will assign COM8 and USB Port 2 will assign COM9.

On this situation, we need to get COM Port number dynamically so that we have flexibility when we plug the Device in our PC regardless any USB port.

After checking further, if the Device without assigned Unique Serial Number will not have Fixed COM Port Number.

This is the work-around how to read COM Port dynamically by reading Windows Registry.

REPEAT
  CLEAR(InstanceID);
  CLEAR(PortName);
  CLEAR(DevicePortFound);

gToolsOcx.getRegKeyStringValue('SYSTEM\CurrentControlSet\services\usbser\Enum',FORMAT(I),InstanceID);
  IF (InstanceID <> '') AND (STRPOS(InstanceID,'VID_04B4&PID_E00A') > 0) THEN BEGIN
    gToolsOcx.getRegKeyStringValue('SYSTEM\CurrentControlSet\Enum\' + InstanceID + '\Device Parameters','PortName',PortName);
    IF (PortName <> '') AND (STRPOS(PortName,'COM') > 0) THEN BEGIN
      DevicePortFound := TRUE;
      PortName := COPYSTR(PortName,4);
    END;
  END;

  I += 1;
UNTIL (DevicePortFound) OR (I = 16); //Limitation of CommCtrl: COM1 to COM16


Note:
You have to find out VID (Vendor ID) and PID (Product ID) of the Device. Normally can be found on device's driver file (.inf) or by using usbdeview or usbview tool (free download) to view PID and VID number.

gToolsOcx is OCX object from LS Retail. you may use WSHShell instead to read registry.

Sunday, June 21, 2015

PERNIKAHAN BUKAN PENTERNAKAN


PERNIKAHAN BUKAN PENTERNAKAN


Ayat bacaan: Kejadian 2:18
===================="TUHAN Allah berfirman: "Tidak baik, kalau manusia itu seorang diri saja. Aku akan menjadikan penolong baginya, yang sepadan dengan dia."

Beberapa minggu yang lalu ada salah seorang siswa yang sudah berkeluarga berbincang-bincang dengan saya selepas kuliah. Obrolan akhirnya sampai kepada keluarga, dan dia bercerita bahwa ia menceraikan istrinya dan kemudian menikah lagi. Alasannya apa?"karena tidak bisa punya anak.." katanya ringan sambil tertawa kecil. Saya merasa kaget, tapi sebenarnya itu adalah sebuah potret kehidupan. Begitu banyak orang yang akhirnya mengalami kegagalan rumah tangga karena kekecewaan akan pasangannya yang belum juga mampu menghadirkan keturunan. Ketika usia terus bertambah, namun tidak juga mendapat keturunan, apalagi setiap hari ditanyai "kapan punya anak" dari keluarga atau teman-teman, mereka pun mulai berpikir bahwa pernikahan mereka telah gagal. Sebagian lagi akan memakai hal ini sebagai alasan untuk menikah lagi untuk kedua kalinya. Apakah saya merasa tidak butuh keturunan? Sama sekali tidak. Saya masih terus berdoa agar Tuhan berkenan memberkati kami dengan keturunan. Saya, sama seperti pasangan lainnya, tentu mengharapkan keluarganya dilengkapi dengan anak-anak. Wajar jika kita berharap akan lahirnya anak-anak dari pernikahan kita. Namun yang ingin saya sampaikan adalah, tujuan utama sebuah pernikahan bukanlah untuk mempunyai anak.Pernikahan bukanlah peternakan.

Dari contoh siswa saya di atas tadi, dan banyak kasus lain mengenai kegagalan rumah tangga akibat tidak mendapat keturunan, saya melihat adanya salah kaprah mengenai tujuan utama mendirikan lembaga pernikahan. Mereka memandang pernikahan layaknya sebuah peternakan, dimana kita bisa mengembangbiakkan keturunan kita. Sekali lagi, pernikahan bukanlah peternakan. Sebuah pernikahan, dimana Tuhan sendiri yang memateraikan pembentukannya, punya tujuan yang jauh lebih penting daripada sekedar memiliki keturunan. Apalagi jika dasarnya hanyalah "kejar tayang" atau takut disebut "bujang lapuk/perawan tua", akibat nafsu, gengsi, desakan orang tua dan lain-lain. Itu semua bukanlah tujuan utama sebuah pernikahan menurut firman Tuhan. Ayat bacaan hari ini menyatakan dengan jelas tujuan Allah menciptakan pasangan buat manusia, yaitu sebagai penolong. Tuhan menciptakan Hawa dari tulang rusuk Adam (Kejadian 2:21), yang menunjukkan sebuah hubungan erat, bahwa istri adalah bagian hidup suami, bukan sekedar alat pemuas nafsu dan "pabrik" pembuat anak.Tapi Tuhan melengkapi kita dengan seorang pasangan agar kita bisa saling melengkapi, saling menyempurnakan dan saling menolong. 

Dalam sebuah pernikahan yang diberkati Tuhan, kita bisa mengalami, menikmati dan saling berbagi sukacita dan cintakasih. Kita bisa saling support ketika salah satu tengah mengalami kesulitan. Kita bisa menghidupkan sebuah persekutuan dengan memuliakan Allah diatas segalanya. Janji pernikahan yang kita ucapkan pun menyatakan hal itu, bukan menyatakan bahwa kita menikah untuk membuat anak. Memiliki penerus garis keturunan adalah penting dan merupakan dambaan hampir setiap orang, namun itu bukanlah yang terutama. 

"Sesungguhnya, anak-anak lelaki adalah milik pusaka dari pada TUHAN.." (Mazmur 127:3). Anak adalah pemberian dan anugerah dari Tuhan. Jangan tawar hati jika hingga saat ini anda masih seperti saya yang belum saatnya dikaruniai anak. Biarlah itu terjadi sesuai kehendak Tuhan, Sang Pencipta. Yang penting adalah kita menyadari hakekat dari sebuah pernikahan sesuai apa yang difirmankan Tuhan. Jangan merasa bahwa tanpa anak, lembaga pernikahan yang anda bangun sebagai sebuah kegagalan. Karena ada Allah yang bertahta di atasnya, yang telah memberkati dan mengikat penyatuan hubungan antara suami dan istri. Jadikan pernikahan sebagai tempat dimana anda bisa bersinergi dengan pasangan untuk memuliakan Tuhan, dan bersama-sama seiring sejalan melakukan kehendak Allah atas kehidupan kita. Pernikahan yang gagal bukanlah pernikahan yang tidak melahirkan anak, melainkan pernikahan yang tidak berjalan sesuai dengan kehendak Tuhan.
ADA ANAK ATAU TIDAK, TETAPLAH MEMILIKI PERNIKAHAN YANG SUKSES PENUH DENGAN KEBAHAGIAAN




Wednesday, May 6, 2015

Maksimalkan Skill Anda!



Untuk mencapai kesuksesan, tidak ada pilihan lain kecuali Anda sendiri mempunyai keahlian, bakat atau potensi diri yang lebih baik dari orang lain. Bahkan ada yang mengatakan untuk menggapai sukses, ‘be extremist’. Faktor lain yang tidak kalah penting adalah "komunikasi" dan "promosi" (bagaimana cara menyampaikan kelebihan Anda ke pihak-pihak luar yang tepat, sehingga mereka mengetahui, lalu tertarik dan memanfaatkan kelebihan atau keunggulan yang Anda miliki).

Ada pepatan bijak dalam bahasa Mandarin, 百艺通, 不如一艺精 bǎi yì tōng bù rú yī yì jīng, arti harfianya “mengerti ratusan keahlian tidak lebih baik daripada menguasai satu yang mendasar”. Maka dalam hidup ini, akan lebih baik menguasai satu keterampilan secara mendalam dibandingkan menguasai banyak tetapi setengah-setengah. Dengan menguasai satu keahlian secara mendalam, akan menjadikan diri Anda unik, spesial dan tiada tandingannya.

Untuk lebih jelasnya, coba simak kisah berikut ini, tentang seekor anak singa dan anak kambing gunung.

Suatu hari di suatu lapangan yang luas, di daerah perbukitan, terlihat seekor singa sedang mengajari anaknya berlari. Melihat langkah anaknya sangat lambat, induknya pun berkata, ”Ayo lari lebih cepat lagi, ayo... tambah cepat lagi...!”

Tapi ternyata ajakan ibunya belum mampu mendorong anak singa tersebut untuk berlari lebih cepat. Akhirnya sang ibu menasihatinya, ”Jika kamu tidak bisa lari lebih cepat dari kambing gunung yang paling lambat, maka kamu akan mati kelaparan di hutan ini.” Kata-kata tersebut menyadarkan si anak, bahwa tidak ada yang bisa menolongnya kecuali ia sendiri harus lebih baik dan lebih cepat dari mangsanya. Seketika itu pula, ia pun mengeluarkan segenap tenaganya, dan ternyata ia bisa berlari dengan sangat kencang.

Pada saat yang bersamaan, di padang rumput hijau di seberang sana, terdapat sekumpulan kambing gunung. Di antara kambing-kambing yang sedang beristirahat, terlihat seekor induk kambing sedang melatih anaknya. Dari jauh terdengar suara ajakan yang bersemangat, ”Ayo lari... ayo lari..... lebih cepat lagi...! Bagus...bagus...! Lebih cepat lagi!”

Ternyata ajakan tersebut tidak juga memotivasi anaknya untuk berusaha berlari lebih cepat. Sampai akhirnya, ibunya mengeluarkan nada yang sedikit mengancam. Ia berkata, ”Jika kamu tidak bisa lari lebih cepat dari singa yang paling cepat, maka hidup kamu akan sia-sia. Cepat atau lambat kamu akan menjadi mangsanya.”

Mendengar kata-kata tersebut, si anak pun berdalih,”Mana mungkin seekor kambing gunung bisa berlari lebih cepat dari singa yang larinya paling cepat?”

Tiba-tiba ibunya berteriak sambil berlari,”Ada singa di belakang kamu! Ayo lari...!” Ancaman yang kelihatan sungguh-sungguh itu, ternyata mampu membuat anak kambing gunung bisa berlari dengan luar biasa cepatnya.

”Nah... kecepatan inilah yang kamu harus pertahankan dan kembangkan untuk bisa sukses mempertahankan hidup,” pesan ibunya.

Netter yang Bijaksana,

Tidak ada yang "tidak bisa" di dunia ini sepanjang kita mempunyai keyakinan, kemauan untuk melaksanakannya. Ada peribahasa dalam bahasa Mandarin yang mengungkapkan bahwa “batang besi pun bisa diasah menjadi jarum” (磨杵成针 mó chǔ chéng zhēn). Kesuksesan apapun bisa diraih, asalkan kita rajin, tekun, dan pantang menyerah. Maju selangkah demi selangkah, konsisten, pada akhirnya akan membawa kita ke jenjang yang lebih bagus, ke puncak kesuksesan.

Dalam kisah di atas, hanya ada satu pilihan bagi masing-masing pihak: ”lebih baik, atau mati”. Singa hanya bisa hidup jika bisa berlari lebih cepat dari kambing gunung yang paling lambat. Dan kambing gunung bisa mempertahankan hidupnya jika ia bisa berlari lebih cepat dari singa yang paling cepat.

Demikian halnya dalam hidup ini, jika kemampuan kita di bawah rata-rata (teman kerja atau seprofesi), yang ada hanyalah menunggu waktu ”kematian” karena selalu tertinggal. Sedangkan bila kemampuan kita setingkat rata-rata, kesempatan yang tersedia hanyalah untuk mempertahankan hidup. Hanya dengan kemampuan di atas rata-ratalah, kita baru bisa mencapai jenjang kehidupan yang lebih baik dan sukses.

Jadi, persiapkan diri Anda dengan sebaik-baiknya dan menjadi manusia yang terbaik di bidang yang Anda tekuni.





from Andrie Wongso

Thursday, April 9, 2015

Error: The object file cannot be used with this version of the program










I am wondered when I tried to export object to folder, there was an error.....
After finding what the issue for few minutes......this was due to objects Nav 2013 were exist on that folder........

Wednesday, April 8, 2015

Navision 2 year digit date support 1930 - 2029



Navision support 2 digits year format from year 1930 to 2029. If you enter a number from 30 to 99 in the year portion of a date, Navision will interprete it as 19XX. If you enter the number from 00 to 29, Navision will interprete it as 20XX

Navision if using Native database can support date range from 0000 to 9999 while SQL Option can suppport date range from 1753 to 9999. If you want to enter any date out of the 1930 to 2029 ranges, you must enter the full 4 digit year format

Tuesday, April 7, 2015

Pseudocode - Read file from Navision


File Method:

FileName := 'D:\interface\';

FileRec.RESET;
FileRec.SETRANGE(Path,FileName);
FileRec.SETRANGE("Is a file",TRUE);
FileRec.SETFILTER(Name, '@*.TXT');
IF FileRec.FINDFIRST THEN
  REPEAT
    CLEAR(ImportFile);
    ImportFile.TEXTMODE := TRUE;
    ImportFile.WRITEMODE := FALSE;
    ImportFile.OPEN(FileName + FileRec.Name);
    FileSize := ImportFile.LEN;
    CurrFilePos := ImportFile.POS;

    WHILE(CurrFilePos <> FileSize) DO BEGIN
      ImportFile.READ(TextLine);
      FOR I := 1 TO STRLEN(TextLine) DO BEGIN
        Chr := COPYSTR(TextLine,I,1);
        MESSAGE(Chr);
      END;
      CurrFilePos := ImportFile.POS;
    END;
    ImportFile.CLOSE;
  UNTIL FileRec.NEXT = 0;

Object:

OBJECT Codeunit 50051 Import Text - Stream Method
{
  OBJECT-PROPERTIES
  {
    Date=08/04/15;
    Time=[ 8:59:11 AM];
    Modified=Yes;
    Version List=MY.LAB;
  }
  PROPERTIES
  {
    OnRun=BEGIN
            FileName := 'D:\interface\';

            FileRec.RESET;
            FileRec.SETRANGE(Path,FileName);
            FileRec.SETRANGE("Is a file",TRUE);
            FileRec.SETFILTER(Name, '@*.TXT');
            IF FileRec.FINDFIRST THEN
              REPEAT
                CLEAR(ImportFile);
                ImportFile.TEXTMODE := TRUE;
                ImportFile.WRITEMODE := FALSE;
                ImportFile.OPEN(FileName + FileRec.Name);
                ImportFile.CREATEINSTREAM(StreamInText);
                WHILE NOT (StreamInText.EOS()) DO BEGIN
                  StreamInText.READTEXT(TextLine);
                  FOR I := 1 TO STRLEN(TextLine) DO BEGIN
                    Chr := COPYSTR(TextLine,I,1);
                    MESSAGE(Chr);
                  END;
                END;
                ImportFile.CLOSE;
              UNTIL FileRec.NEXT = 0;
          END;

  }
  CODE
  {
    VAR
      FileRec@1000000002 : Record 2000000022;
      ImportFile@1000000001 : File;
      FileName@1000000000 : Text[250];
      TextLine@1000000005 : Text[1024];
      FileSize@1000000004 : Integer;
      CurrFilePos@1000000003 : Integer;
      EntryNo@1000000007 : Integer;
      Chr@1000000008 : Text[1];
      I@1000000010 : Integer;
      StreamInText@1000000009 : InStream;

    BEGIN
    END.
  }
}




Stream Method:

FileName := 'D:\interface\';

FileRec.RESET;
FileRec.SETRANGE(Path,FileName);
FileRec.SETRANGE("Is a file",TRUE);
FileRec.SETFILTER(Name, '@*.TXT');
IF FileRec.FINDFIRST THEN
  REPEAT
    CLEAR(ImportFile);
    ImportFile.TEXTMODE := TRUE;
    ImportFile.WRITEMODE := FALSE;
    ImportFile.OPEN(FileName + FileRec.Name);
    ImportFile.CREATEINSTREAM(StreamInText);
    WHILE NOT (StreamInText.EOS()) DO BEGIN
      StreamInText.READTEXT(TextLine);
      FOR I := 1 TO STRLEN(TextLine) DO BEGIN
        Chr := COPYSTR(TextLine,I,1);
        MESSAGE(Chr);
      END;
    END;
    ImportFile.CLOSE;

  UNTIL FileRec.NEXT = 0;

Object:

OBJECT Codeunit 50050 Import Text - File Method
{
  OBJECT-PROPERTIES
  {
    Date=08/04/15;
    Time=[ 8:59:01 AM];
    Modified=Yes;
    Version List=MY.LAB;
  }
  PROPERTIES
  {
    OnRun=BEGIN
            FileName := 'D:\interface\';

            FileRec.RESET;
            FileRec.SETRANGE(Path,FileName);
            FileRec.SETRANGE("Is a file",TRUE);
            FileRec.SETFILTER(Name, '@*.TXT');
            IF FileRec.FINDFIRST THEN
              REPEAT
                CLEAR(ImportFile);
                ImportFile.TEXTMODE := TRUE;
                ImportFile.WRITEMODE := FALSE;
                ImportFile.OPEN(FileName + FileRec.Name);
                FileSize := ImportFile.LEN;
                CurrFilePos := ImportFile.POS;

                WHILE(CurrFilePos <> FileSize) DO BEGIN
                  ImportFile.READ(TextLine);
                  FOR I := 1 TO STRLEN(TextLine) DO BEGIN
                    Chr := COPYSTR(TextLine,I,1);
                    MESSAGE(Chr);
                  END;
                  CurrFilePos := ImportFile.POS;
                END;
                ImportFile.CLOSE;
              UNTIL FileRec.NEXT = 0;
          END;

  }
  CODE
  {
    VAR
      FileRec@1000000002 : Record 2000000022;
      ImportFile@1000000001 : File;
      FileName@1000000000 : Text[250];
      TextLine@1000000005 : Text[1024];
      FileSize@1000000004 : Integer;
      CurrFilePos@1000000003 : Integer;
      EntryNo@1000000007 : Integer;
      Chr@1000000008 : Text[1];
      I@1000000010 : Integer;

    BEGIN
    END.
  }
}



Monday, January 26, 2015

How to check double byte (Simple Way)




//TEmpVar ==> Text
//ASCIIText ==> Integer
TempVar := 'Special Characters (Kanji,Chinese,etc)';
ASCIIText := TempVar[1];
IF ((ASCIIText > 128 ) AND (ASCIIText < 160)) OR
   ((ASCIIText > 223 ) AND (ASCIIText < 240))
THEN
  MESSAGE('double byte');