วันพุธที่ 8 เมษายน พ.ศ. 2558

การติดตั้ง SAP ABAP

ครั้งแรกผมว่าจะสอนวิธีติดตั้งเอง แต่ก็กลัวเรื่อง ลิขสิทธิ์ (เอ๊ะ หรือว่าคิดมากไปเอง) 

เอาเป็นว่า ไปดูเว็บฝรั่งก็ได้น่ะ หรือไม่ก็ youtube ก็มีน่ะ 

http://sapficonsultant.com/sap-erp-6-0-ehp6-ides-install-on-oracle-and-windows-2008-r2/ 


เวลาผมดูก็อ่านภาษาอังกฤษไม่ออกเหมือนกัน (แต่ถ้าภาษาลาว มาโลด อ้ายบ่ย่านดอกเด้อ สิบอกให้)
 ดูฝรั่งสอนก็ อาศัยการดูรูปเอา หรือขั้นตอนต่างๆ เขาก็จะบอกอยู่น่ะฮ่ะ แต่จริงๆ sap มันแยกย่อยออกมาหลายตัวเหมือนกันน่ะ

 แต่ถ้าใครสนใจอยากจะเขียนจริงๆ ลอง sap netweaver ก็ได้ มันจะได้อยู่ 90 วัน (มั้ง) แต่ต้องไปสมัครสมาชิกก่อนเน้อ ถึงจะโหลดได้
 https://store.sap.com/sap/cpa/ui/resources/store/html/SolutionDetails.html?pcntry=US&sap-language=EN&pid=0000000218 

เขียนได้เหมือนกัน แต่ก่อนผมก็ใช้ฝึกอยู่ ใช้ Database MaxDB แต่จะไม่เห็นพวก menu อะไรน่ะ มีแต่ sap tool แต่แค่นี้ก็พอเขียนแล้วล่ะ เวลาติดตั้ง ไม่ยากเท่าไหร่ ลง jdk (่Java) ใน youtube ก็มีสอนน่ะ ของอีตาฝรั่งอันหนึ่งนี่ล่ะ

https://www.youtube.com/watch?v=km0MbEQxvOo

 ผมว่าเขาสอนดีน่ะ *



แต่สำหรับใครที่อยากลงตัวเต็ม อันนี้ขอบอกเลยน่ะ ผมหัดลงเป็นเดือน ถ้าครั้งแรกๆน่ะ ลองผิดลองถูกอยู่นั่นล่ะ ลงวินโดว์ วันล่ะเป็นสิบรอบก็มี แต่ก็ไม่เป็นไร เราศึกษาหนิ เราไม่ได้อะไรมากมาย ขอให้ใจรักเน๊าะ ความต้องการก็เยอะซ่ะเหลือเกิน Harddisk ก็ไม่ต่ำกว่า 500 GB (พื้นที่ว่างน่ะ) ไม่รวมลง windows แต่ทุกวันนี้ ลงครั้งเดียวก็ผ่านล่ะ พอจับจุดได้ 

*ความรู้สึกของการเขียน ABAP ผมว่าก็เหมือนการเขียนโปรแกรมทั่วไปล่ะ ไม่มีอะไรยากไปว่าเลย แต่ชื่อ Table มันจะสั้นๆ Table ก็เป็นพัน แต่ผมก็ไม่เคยทำงานด้านนี้ จริงๆน่ะ เพราะว่าการที่จะเข้าไปใน วงการ SAP ได้หนิ ยากเหมือนกัน อาศัยประสบการณ์ทั้งนั้น ไหนจะภาษาอังกฤษที่ผมอ่อนแออยู่ ทุกวันนี้ก็ศึกษาไปเรื่อยล่ะ (ได้ทุกภาษาแต่เป็นเป็ด ก๊าบๆๆ น่ะ) ไม่เป็นไร มันคือความสุขหนิ


 *ส่วนค่าเรียน SAP ก็ไม่ต้องห่วง หมดนาเป็น ทุ่งๆ แถวบ้านผมทำนา (ลูกชาวนาเน๊าะ) แต่ก็แลกมาด้วยค่าตอบแทนที่สูง อย่างว่าล่ะ เขียน SAP ABAP ได้อย่างเดียวคงไม่พอ คงต้องรู้เรื่อง Bussiness ของบริษัทเขาอีก เพราะในประเทศไทย เน้น All in One -กาแฟสำเร็จรูป

 *อันนี้เว็บ SAP ที่ผมศึกษาอยู่ http://www.guru99.com/ ผมชอบน่ะ (ชอบตรงมีรูป 555) ป่าวหรอก เขาก็สอนดูีอยู่ อันไหนไม่รู้ก็ เปิด google แปลเอา หาเพิ่มเติมเอา แต่ถ้าเราบอกว่ามันยาก มันจะปิดกั้นเรามากเลยน่ะผมว่า ถ้ายากปุ๊บ เราจะไม่อยากศึกษาเลย เหมือนสาวๆ ถ้าบอกว่าสวยปุ๊บ อยากรู้จักทันที แต่ถ้าบอกว่า ไม่สวย อ้วน ตุ้ยนุ้ย ฯลฯ ไม่ค่อยอยากรู้จัก แต่สำหรับผม ผมชอบคนที่ใจน่ะฮ่ะ 555++ 


-จะมีใครหลงเข้ามาอ่านไหมหน้อ เห่อะๆ แต่ก็ไม่เป็นไร มันบล็อกของเรา ครั้งหนึ่งเราเคยได้เขียน อีกสักสิบปี มาอ่านก็คงไม่สาย 555++
* อยากฝากถึงใครที่จะไปเรียนน่ะ ถ้าใจเราไม่รัก ไม่ฝักใฝ่ ต่อให้ไปเรียนกับ อ. คนไหนก็เท่าเดิมล่ะ ถ้าจะศึกษาจริงๆ อ. Goo ก็มีเยอะ เหมือนกันน่ะ อาจจะเรียนรู้ช้ากว่าหน่อย แต่ประหยัดตังค์ได้มากเลยเด้อ
สิบอกให้.

C# Delegate การส่งค่าระหว่าง ฟอร์ม

ผมเคยไปหาๆอ่านเรื่อง delegate ของคนอื่นที่เขียนไว้ แต่ก็ยาวซ่ะเหลือเกิน หรือเวลายกตัวเองก็เขียนซ่ะแบบ Advance เกิน ยากแก่การเข้าใจสำหรับ Progamon เป็ดน้อยอย่างผม ดูจาก เว็บ microsoft ก็ประมาณว่า delegate สามารถเรียก Method อื่นได้ แต่ถึงอย่างนั้นก็ต้อง new Object อยู่ดี (อันนี้เดาเอง เห่อะๆ) เข้าเรื่องเลย *** จริงๆผมก็ไม่ค่อยเข้าใจเรื่อง delegate สักเท่าไหร่ แต่พอเขียนออกมาได้ ยังไงก็ศึกษาพอเป็นแนวทางแล้วกันเน๊าะ หลักการที่ผมนำเอา delegate มาใช้ก็คงหนีไม่พ้นเรื่องส่งตัวแปรระหว่างฟอร์ม เช่น การทำ popHelp ต่างๆ ส่วนหน้าตาก็ประมาณนี้ มาดูโค้ดกันเลยแล้วกัน
//Form1
   public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public delegate void SendControl(TextBox text); //ประกาศ Delegate ใช้สำหรับส่งไปฟอร์ม 2

        private void cmdSend_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2();
            //ส่ง
            SendControl del = new SendControl(form2.funData);
            del(this.txtName);

            //รับ กลับมา
            form2.passControl = new Form2.PassControl(PassData);
            form2.Show();
        }

        private void PassData(object sender) // method รับค่ากลับ
        {
            this.label1.Text = ((TextBox)sender).Text;
        }
    }
//Form2
  public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();

        }
        // Define delegate
        public delegate void PassControl(object sender); //ประกาศ Delegate ใช้สำหรับส่งไปฟอร์ม 1 ส่งค่ากลับ


        public PassControl passControl; //

        private void cmdSend_Click(object sender, EventArgs e)
        {
            if (passControl != null)
            {
                passControl(txtName);
            }
          //  this.Hide();
        }



        internal void funData(TextBox text) // method สำหรับรับค่ามา
        {
            this.label1.Text = text.Text;
        }
    }
คงพอเข้าใจอยู่หรอกเน๊าะ แต่จริงๆ เวลาค่าไป ใช้ Constructor ก็ได้น่ะ แล้วแต่ใครจะไปประยุกต์ใช้เลย ผิดพลาดประการใด ก็ขออภัยไว้น่ะที่นี่ด้วย ผมก็ไม่ค่อยเข้าใจมัน หรือว่ามันไม่เข้าใจผมก็ไม่รู้น่ะฮ่ะ.. ^-^

วันจันทร์ที่ 6 เมษายน พ.ศ. 2558

ว่าด้วยเรื่องการแปลงวันที่ C# VB.NET

C# การแปลงวันที่ จากปี พ.ศ.ให้เป้นปี ค.ศ. (-543) โหลด มาใส่ ครั้งแรก ตรงเปิด ฟอร์ม Form_Load
        Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

//อันนี้เอาไว้ get value จาก datetimepicker

            var start_date = dateTimePicker1.Value.ToString("yyyy-MM-dd");

//แต่ถ้าจะเอาวันปัจจุบันก็ getdate() เอามาจาก sqlserver ไปเลย

//เวลาแปลงกลับ จาก datebase
Convert.ToDateTime(ds.Tables[0].Rows[0]["start_date"].ToString());

VB.Net การแปลงวันที่ จากปี พ.ศ.ให้เป้นปี ค.ศ. (-543)
      Dim dateFormat As DateTimeFormatInfo = New CultureInfo("en-US").DateTimeFormat
        Dim todate_date = DateTime.Now.ToString("yyyy-MM-dd", dateFormat) 'วันปัจจุบัน
        Dim create_date As String = DateTimePicker1.Value.ToString("yyyy-MM-dd", dateFormat) 'วันที่จาก DateTimePicker

//CDate("12/12/2008") เวลาโหลดกลับ

วันพฤหัสบดีที่ 2 เมษายน พ.ศ. 2558

Module VB.Net เอาไว้ เพิ่ม ลบ แก้ไข

พอดีวันนี้ได้ ทดสอบ (CRUD) การเขียน Vb.net ปกติจะไม่เขียน เพราะไม่ชอบ vb มาแต่ไหนแต่ไรแล้ว
แต่เพราะจะไปสมัครงานอยู่ที่หนึ่ง เลยลองๆมาเขียนดู แต่ก็สนุกดีน่ะ


อันนี้ส่วนของ Table น่ะ
CREATE TABLE [dbo].[users](
 [id] [int] IDENTITY(1,1) NOT NULL,
 [name] [varchar](50) NULL,
 [username] [varchar](50) NULL,
 [password] [varchar](50) NULL,
 CONSTRAINT [PK_users] PRIMARY KEY CLUSTERED 
(
 [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]




ผมอธิบายไม่เก่ง มาดูโค้ดเลยล่ะกัน
Module ExecuteModule
    Dim conn As SqlClient.SqlConnection
    Dim cmd As New SqlClient.SqlCommand
    Dim adapter As New SqlClient.SqlDataAdapter
    Dim ds As DataSet


    Dim strConn As String = "Server=192.168.0.8;UID=sa;PASSWORD=Admin*9;database=tmpdbms;Max Pool Size=400;Connect Timeout=600;"
    'ส่วนนี้จะเป็นส่วนของการเลือกข้อมูล Select จะส่งค่ากลับเป็น DataSet
    ' 
    Function GetDataSet(ByVal strSql As String) As DataSet
        Try
            conn = New SqlClient.SqlConnection(strConn)

            With cmd
                .Connection = conn
                .CommandText = strSql
                .CommandType = CommandType.Text
            End With
            ds = New DataSet()
            adapter.SelectCommand = cmd
            adapter.Fill(ds)

        Catch ex As Exception
            MessageBox.Show(ex.Message)

        Finally

            conn.Close()
            cmd.Dispose()

        End Try

        Return ds
    End Function

    'ส่วนนี้จะเป็นส่วนของการ insert update delete
    Function Execute(ByVal strSql As String) As Integer
        Dim i As Integer = 0
        Try
            conn = New SqlClient.SqlConnection(strConn)
            conn.Open()
            With cmd
                .Connection = conn
                .CommandText = strSql
                .CommandType = CommandType.Text
            End With
            i = cmd.ExecuteNonQuery()

        Catch ex As Exception
            MessageBox.Show(ex.Message)

        Finally

            conn.Close()
            cmd.Dispose()

        End Try

        Return i
    End Function

    'ส่วนนี้จะเป็นส่วนของการ insert update delete เหมือนกัน แต่เป็นการยัด parameter เข้าไป (โปรแกรมไม่ต้องเรียก sql ซ้ำ)
    Function ExecuteParameter(ByVal strSql As String, ByVal hastTable As Hashtable) As Integer

        Dim i As Integer = 0
        Dim hast As DictionaryEntry
        Try
            conn = New SqlClient.SqlConnection(strConn)
            conn.Open()
            cmd = New SqlClient.SqlCommand(strSql, conn)

            With cmd
                For Each hast In hastTable
                    ' .Parameters.Add(New SqlParameter("@sName","TEST"))
                    .Parameters.AddWithValue(hast.Key, hast.Value)
                Next
            End With

            i = cmd.ExecuteNonQuery()


        Catch ex As Exception
            MessageBox.Show(ex.Message)

        Finally

            conn.Close()
            cmd.Dispose()
        End Try

        Return i
    End Function

    ' ส่วนนี้เป็นการเรียกใช้งาน procedure แล้วส่งค่ากลับเป็น DataSet 
    Function ExecuteProcedure(ByVal strSql As String, ByVal hastTable As Hashtable) As DataSet
        Try
            conn = New SqlClient.SqlConnection(strConn)
            cmd = New SqlClient.SqlCommand(strSql, conn)
            cmd.CommandType = CommandType.StoredProcedure
            With cmd
                For Each hast In hastTable
                    ' .Parameters.Add(New SqlParameter("@sName","TEST"))
                    .Parameters.AddWithValue(hast.Key, hast.Value)
                Next
            End With
            ds = New DataSet()
            adapter.SelectCommand = cmd
            adapter.Fill(ds)

        Catch ex As Exception
            MessageBox.Show(ex.Message)

        Finally

            conn.Close()
            cmd.Dispose()

        End Try

        Return ds

    End Function


End Module



Public Class Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        Dim strSql As String
        Dim result As Integer
        If Button1.Text = "Save" Then
            strSql = "insert into users values ('" + TextBox1.Text + "','" + TextBox2.Text + "','" + TextBox3.Text + "')"

            result = ExecuteModule.Execute(strSql)

            If result > 0 Then
                MsgBox("Insert Seccess")
            End If
        Else
            strSql = "update users set name= '" + TextBox1.Text + "' , username = '" + TextBox2.Text + "',password = '" + TextBox3.Text + "' "
            strSql &= " where id = '" + Label4.Text + "' "
            result = ExecuteModule.Execute(strSql)

            If result > 0 Then
                MsgBox("Update Seccess")
            End If

        End If
    End Sub

    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        Dim strSql As String

        strSql = "select * from users order by id desc"
        Dim ds As New DataSet
        ds = ExecuteModule.GetDataSet(strSql)
        Call ClearValue()
        If (ds.Tables(0).Rows.Count > 0) Then
            Me.DataGridView1.DataSource = ds.Tables(0)
        End If

        Button1.Text = "Save"

    End Sub


    Private Sub DataGridView1_CellClick(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick
        TextBox1.Text = DataGridView1.Item(1, e.RowIndex).Value.ToString
        TextBox2.Text = DataGridView1.Item(2, e.RowIndex).Value.ToString
        TextBox3.Text = DataGridView1.Item(3, e.RowIndex).Value.ToString
        Label4.Text = DataGridView1.Item(0, e.RowIndex).Value.ToString
        Button1.Text = "Update"
    End Sub

    Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click

        Dim strSql As String
        strSql = "delete from users where id = @id "

        Dim obj As New Hashtable

        obj.Add("@id", Label4.Text)

        Dim i As Integer

        If MsgBox("ต้องการลบข้อมูล?", MsgBoxStyle.YesNoCancel, "Title") = MsgBoxResult.Yes Then

            i = ExecuteModule.ExecuteParameter(strSql, obj)

            If (i > 0) Then

                MessageBox.Show("ลบข้อมูลเรียบร้อยแล้ว")

            End If
        End If



    End Sub


    Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click

        Dim strSql As String
        strSql = "SP_User"

        Dim obj As New Hashtable

        obj.Add("@parameter1", Convert.ToInt32(TextBox4.Text))


        Dim ds As DataSet
        ds = ExecuteModule.ExecuteProcedure(strSql, obj)

        If (ds.Tables.Count > 0) Then
            Me.DataGridView1.DataSource = ds.Tables(0)
        End If


    End Sub

    Private Sub Button5_Click(sender As System.Object, e As System.EventArgs) Handles Button5.Click
        Call ClearValue()
    End Sub


    Sub ClearValue()
        Me.DataGridView1.DataSource = Nothing
        Me.DataGridView1.Rows.Clear()
        Me.DataGridView1.Columns.Clear()
    End Sub
End Class


ปกผมเขียน แต่ C#,Java,PHP แต่มาเขียน VB.NET ก็ตื่นเต้นไปอีกแบบ
จากที่ไม่ชอบก็เริ่มชอบล่ะ
.... อย่างว่าล่ะครับทุกวันนี้ ถึงแม้เราเก่ง (ถ้าไม่เป็นนายตัวเองน่ะ) เราไปสมัครงาน ความต้องการของแต่ล่ะที่ก็เยอะซ่ะเหลือเกิน
ซึ่งการเขียนโปรแกรมเก่งอย่างเดียวคงไม่พอ ต้องได้ภาษา implement เป็น สอน User ได้ สรุป All in One
ฟังดูเหมือน คุณค่าของโปรแกรมเมอร์มันน้อยซ่ะเหลือเกิน แต่ก็ไม่เป็นไร เราทำแล้วเรามีความสุขที่ได้ทำมัน ผมก็ถือว่าคุ้มล่ะ
วันนี้เอาแค่นี้ก่อน เดียววันหลังหาอะไรมาเขียนเล่นๆ อีก

ไม่แน่ บางทีผมอาจสอน SAP ABAP ก็ได้ เพราะผมศึกษามาได้สักพักใหญ่ๆแล้ว ติดตามตอนต่อไปน่ะครับ..
โปรแกรมมั่ว..

วันอังคารที่ 31 มีนาคม พ.ศ. 2558

ว่าด้วยเรื่อง Spring Framework

วันนี้ไปอ่านเจอบทความ เขียนเกี่ยวกับเรื่อง Spring Framework อ่านแล้วเข้าใจดี เลยเอามาโพสไว้อ่าน นิดหนึ่ง บทความนี้เห็นโพสต์ในการตอบกระทู้ ซึ่งตอบโดยคุณ tunn http://greatfriends.biz/webboards/msg.asp?id=39032

 Spring framework ตัวนี้ สุดๆ เลยครับ ทำให้เราเขียนโปรแกรมแบบ OO concept จริงๆ แต่ไปๆมาๆดันเหมือนเขียนโปรแกรมกับ config ซึ่งถ้าเขียนบน java มันมี spring bean editor เป็น plug in บน eclipse ทำให้เขียน config ง่ายหน่อย แต่ถ้าบน .net นี่ตอนนี้ยังเหนื่อยอยู่ คงต้องรอซักพัก

Concept ของ spring มีด้วยกัน 3 ส่วนครับคือ

- IoC ( inversion of control เน้นไปทาง DI ( dependency injection) spring ยิง object เข้ามาให้ )

- AOP ( Aspect Oriented Programming ทำให้เรา maintain โปรแกรมได้ง่ายขึ้น แต่ทำจริงก็ใช่ว่าจะง่าย ส่วนมากเอาไปใช้ ในงาน เกี่ยวกับ transaction , logging )

- Abstract base class ต่างๆ ทำให้ เขียนเพิ่มเติม ต่อยอด intregateระบบ ได้ง่ายขึ้น เช่น ในส่วนของ Data Access Layer คุณอาจจะใช้ NHibernate, ADO.NET หรือ iBatis.NET ก็แล้วแต่ คุณก็เอามา plug เข้ากับ bussiness layer โดยที่ตัว client ของคุณ ไม่จำเป็นต้องเปลี่ยนแปลง code เลย

 ตัวอย่าง นะครับ


 IoC :
   class Sorter {
        private ICollection collection;
        private ISortAlgo sortAlgo;
        public ISortAlgo SortAlgo {
             get { return this.sortAlgo; }
             set { this.sortAlgo = value; }
        }
        public ICollection Collection {
             get { return this.collection; }
             set { this.collection = value; }
        } 
 
        public void sorting() {
             this.sortAlgo.sort(this.collection);
        }
   }
 
   interface ISortAlgo {
          void sort(ICollection collection);
   }
 
   class BubbleSortAlgo : ISortAlgo {
         public void sort(ICollection collection) {
          // to do : implement bubble sort algo
         }
   }
   
   class InsertionSortAlgo : ISortAlgo {
         public void sort(ICollection collection) {
              // to do : implement insertion sort algo
         }
   }
 
spring config
   
        
   
   
   
   
   
   
   
เรียกใช้งาน
   public class Program {
      public static void Main() {
                    Sorter sorter = getSpringContext().getObject("sorter") as Sorter; 
                    sorter.Collection = getSampleCollection();
                    sorter.sorting();
                    display(sorter.Collection);
      }
   }
   

ประเด็นจะอยู่ตรง Class Sorter ครับ ถ้าเราเขียนแบบเดิม เวลาเราจะเปลี่ยน Sorting Algo เราต้องเขียนประมาณว่า

 ISortAlgo sortAlgo = new BubbleSortAlgo();
 หรือ
 ISortAlgo sortAlgo = new InsertionSortAlgo();

 ซึ่งจะทำให้เราต้องไปผูกกับ class ที่ implement interface ISortAlgo ไม่ตัวใดตัวหนึ่ง และ การเปลี่ยนอาจต้งอ compile program ใหม่ แต่ถ้าเราใช้ spring เราเพียงแค่ config ว่าจะยิง Sorting Algo ตัวไหนเข้าไป ( ตรง spring config น่ะครับ ) เปลี่ยน หรือ โปรแกรม เราไม่เปลี่ยนแปลง ไม่ต้อง complie ที่สำคัญคือ โปรแกรมเราผูกอยู่กับ interface ไม่ใช้ตัว implementation

Introduction to ABAP (เกริ่นนำ SAP ABAP สักหน่อยก่อนเน๊าะ)

ถ้าจะบอกว่า SAP คืออะไร ก็คงอธิบายเหมือนเว็บหรือหนังสือเล่มอื่นๆ เน๊าะ
         SAP เป็น ERP ประเภทหนึ่ง ทำงานแบบ Client/Server (รายละเอียดลองศึกษาเองน่ะ ERP คืออะไร Client/Server คืออะไร)
         SAP ถูกพัฒนาขึ้นด้วยภาษา ABAP (Advance Business Application Programming)  ซึ่งปัจจุบันเป็นภาษาโปรแกรมในยุคที่ 4 หรือ 4GL  (ABAP/4) โดยเวอร์ชั่นใหม่นี้  ABAP สามารถเรียกใช้งาน ABAP Objects และ supports การเขียนโปรแกรมแบบ OOP (object-oriented programming)


มาพูดเรื่อง (ประเภทของตัวแปร) Data Types ใน ABAP บ้าง
อันนี้รูปแบบของ Data Types

       
DATA Variable_Name Type Variable_Type
ส่วนการเรียกใช้งานก็ประมาณนี้
DATA employee_number Type I.























*การจบประโยคใน ABAP จะจบประโยคด้วย . (period)
** การเขียนโปรแกรมทุกภาษาก็ล้วนแล้วแต่มีการประกาศ Data Types ที่คลายๆกัน
ผมอาจจะอธิบายไม่ค่อยเก่ง เพราะปกติก็ไม่ได้เขียนเป็นอาชีพ แค่ศึกษาหาความรู้เฉยๆ
เอาเป็นว่า ถ้าผมรู้อะไรก็จะมาโพสต์ไว้แล้วกันเน๊าะ
เดียวครั้งหน้าจะมาต่อเรื่องการเขียน Data Object  - Structure

วันพุธที่ 25 มีนาคม พ.ศ. 2558

แปลงตัวเลขเป็นตัวหนังสือ Java - Convert Number Thai Java


 public static String ThaiBaht(String txt) {
  String bahtTxt, n, bahtTH = "";
  Double amount;
  try {
   amount = Double.parseDouble(txt);
  } catch (Exception ex) {
   amount = 0.00;
  }

  try {
   DecimalFormat df = new DecimalFormat("####.00");
   bahtTxt = df.format(amount);
   String[] num = { "ศูนย์", "หนึ่ง", "สอง", "สาม", "สี่", "ห้า",
     "หก", "เจ็ด", "แปด", "เก้า", "สิบ" };
   String[] rank = { "", "สิบ", "ร้อย", "พัน", "หมื่น", "แสน", "ล้าน" };
   String[] temp = bahtTxt.split("[.]");
   String intVal = temp[0];
   String decVal = temp[1];
   if (Double.parseDouble(bahtTxt) == 0)
    bahtTH = "ศูนย์บาทถ้วน";
   else {
    for (int i = 0; i < intVal.length(); i++) {
     n = intVal.substring(i, i + 1);
     if (n != "0") {
      if ((i == (intVal.length() - 1)) && (n == "1"))
       bahtTH += "เอ็ด";
      else if ((i == (intVal.length() - 2)) && (n == "2"))
       bahtTH += "ยี่";
      else if ((i == (intVal.length() - 2)) && (n == "1"))
       bahtTH += "";
      else
       bahtTH += num[Integer.parseInt(n)];
      bahtTH += rank[(intVal.length() - i) - 1];
     }
    }
    bahtTH += "บาท";
    if (decVal == "00")
     bahtTH += "ถ้วน";
    else {
     for (int i = 0; i < decVal.length(); i++) {
      n = decVal.substring(i, i + 1);
      if (n != "0") {
       if ((i == decVal.length() - 1) && (n == "1"))
        bahtTH += "เอ็ด";
       else if ((i == (decVal.length() - 2)) && (n == "2"))
        bahtTH += "ยี่";
       else if ((i == (decVal.length() - 2)) && (n == "1"))
        bahtTH += "";
       else
        bahtTH += num[Integer.parseInt(n)];
       bahtTH += rank[(decVal.length() - i) - 1];
      }
     }
     bahtTH += "สตางค์";
    }
   }
  
  } catch (Exception exe) {

   System.out.print(exe.getMessage());
  }
  return bahtTH;

 }
มาดูส่วนวิธีเรียกใช้งานบ้าง
public class Test {

 public static void main(String[] args) {

  String txt = "123.456";
  String Bath = ThaiBaht(txt);
  
  System.out.println(Bath);
 }
}

*** ผมไม่ได้คิดเองน่ะครับ copy มาจาก thaicreate แต่ของเก่าเขียนไว้ด้วย (C#) ผมเลยเอาปรับใช้ ใน JAVA นิดหนึ่ง http://www.thaicreate.com/community/c-asp-net-convert-money-number-to-thai-text.html

วันพุธที่ 18 มีนาคม พ.ศ. 2558

แปลงตัวเลขเป็นตัวหนังสือ c# - Convert Number Thai C Shap


public static string cv(string num){
     
            string[][] th_num = new string[3][];
            string[] th_digit = { "", "สิบ", "ร้อย", "พัน", "หมื่น", "แสน", "ล้าน" }; 
 
            th_num[0] = new string[10] { "", "หนึ่ง", "สอง", "สาม", "สี่", "ห้า", "หก", "เจ็ด", "แปด", "เก้า" };
            th_num[1] = new string[2] { "หนึ่ง", "เอ็ด" };
            th_num[2] = new string[2] { "สอง", "ยี่" };

            int ln = num.Length;

            string t = "";
            for (int i = ln; i > 0; i--) {
                var x = i - 1;
                 var n = Convert.ToInt32(num.Substring(ln - i, 1));
                 var digit = x % 6;
                if (n != 0) {
                    if (n == 1) {
                        t += (digit == 1) ? "" : th_num[1][digit == 0 ? 1 : 0];
                    } else if (n == 2) {
                        t += th_num[2][digit == 1 ? 1 : 0];
                    } else {
                        t += th_num[0][n];
                    }
                    t += th_digit[(digit == 0 && x > 0 ? 6 : digit)];
                } else {
                    t += th_digit[digit == 0 && x > 0 ? 6 : 0];
                }
            }
            return t;
        }
มาดูส่วนวิธีเรียกใช้งานบ้าง
 class Program
    {
 static void Main(string[] args)
        {
            var num = "111,111,111,111,111.11";

            var data = Convert.ToDecimal(num).ToString().Split('.');
            string dic = "";
            if (cv(data[1]) == "") { dic = ""; } else { dic = cv(data[1]) + "สตางค์"; };
            string convert = cv(data[0]) + "บาท" + dic ;

            Console.WriteLine(convert);
            System.Console.ReadKey();
        }
}
*** ผมไม่ได้คิดเองน่ะครับ copy มาจาก ท่านนี้ Chaidhanan ใน thaicreate แต่ของเก่าเขียนไว้ด้วย (PHP) ผมเลยเอาปรับใช้ ใน c# นิดหนึ่ง http://www.thaicreate.com/community/c-asp-net-convert-money-number-to-thai-text.html

วันพฤหัสบดีที่ 8 มกราคม พ.ศ. 2558

C# OOP CRUD (insert update deletet procedure logtable) คลาส เพิ่ม ลบ แก้ไข

class Execute
    {
        private SqlConnection strConnection;
        private SqlDataAdapter adapter;
        private DataSet ds;

        public Execute(string strConn)
        {
            this.strConnection = new SqlConnection(strConn);
        }
        public string strSQL { get; set; }
        public string strType { get; set; }

        public DataSet selectStoredProcedure(string code,string year)
        {
            //insertLogData("procedure");
                ds = new DataSet();
                adapter = new SqlDataAdapter();
                this.strConnection.Open();
                SqlCommand cmd = new SqlCommand(this.strSQL, this.strConnection);
                cmd.CommandType = CommandType.StoredProcedure; // set it to stored proc
                cmd.Parameters.Add("@code", SqlDbType.VarChar).Value = code;
                cmd.Parameters.Add("@target_year", SqlDbType.VarChar).Value = year;
                adapter = new SqlDataAdapter(cmd);
                adapter.Fill(ds);
                this.adapter.Dispose();
                this.strConnection.Close();
                return ds;
         
        }

        public DataSet selectCommand()
        {
            ds = new DataSet();
            adapter = new SqlDataAdapter();
            this.strConnection.Open();
            adapter.SelectCommand = new SqlCommand(this.strSQL, this.strConnection);
            adapter.Fill(ds);
            this.adapter.Dispose();
            this.strConnection.Close();
            return ds;
        }

        public int insertCommand()
        {
            //insertLogData("insert");
            adapter = new SqlDataAdapter();
            this.strConnection.Open();
            adapter.InsertCommand = new SqlCommand(this.strSQL, this.strConnection);
            int i = adapter.InsertCommand.ExecuteNonQuery();
            this.adapter.Dispose();
            this.strConnection.Close();
            return i;
        }

        public int updateCommand()
        {
            //insertLogData("update");
            adapter = new SqlDataAdapter();
            this.strConnection.Open();
            adapter.UpdateCommand = strConnection.CreateCommand();
            adapter.UpdateCommand.CommandText = this.strSQL;
            int i = adapter.UpdateCommand.ExecuteNonQuery();
            this.adapter.Dispose();
            this.strConnection.Close();
            return i;
        }

        public int deleteCommand()
        {
            //insertLogData("delete");
            adapter = new SqlDataAdapter();
            this.strConnection.Open();
            adapter.DeleteCommand = strConnection.CreateCommand();
            adapter.DeleteCommand.CommandText = this.strSQL;
            int i = adapter.DeleteCommand.ExecuteNonQuery();
            this.adapter.Dispose();
            this.strConnection.Close();
            return i;
        }
}
Method เอาไว้เก็บ Log ไฟล์
       public void insertLogData(string tbstatus)
        {
            string sql = "insert into tbllogdata (username,createdate,sqltext,tbstatus) values ";
            sql += "('xxx',getdate(),'" + this.strSQL + "','" + tbstatus + "')";
            adapter = new SqlDataAdapter();
            this.strConnection.Open();
            adapter.InsertCommand = new SqlCommand(sql, this.strConnection);
            adapter.InsertCommand.ExecuteNonQuery();
            this.adapter.Dispose();
            this.strConnection.Close();
        }

การติดตั้ง SAP ABAP

ครั้งแรกผมว่าจะสอนวิธีติดตั้งเอง แต่ก็กลัวเรื่อง ลิขสิทธิ์ (เอ๊ะ หรือว่าคิดมากไปเอง)  เอาเป็นว่า ไปดูเว็บฝรั่งก็ได้น่ะ หรือไม่ก็ youtube ...