# مباحث متفرقه برنامه نویسی > گزارش سازی با Crystal Report >  نحوه تبدیل عدد به حروف در کریستال ریپورت

## hadi2345

چگونه می توان توسط فرمولا فیلد در کریستال ریپورت عدد را به حروف تبدیل کرد 
یا 
چگونه میتوانیم یک dll را به توابع کریستال ریپورت اضافه کرد

----------


## sm

شما میتونین توی کریستال با Syntax زبان VB و C کدنویسی انجام بدین که البته در این مورد خاص منطقی نیست.
شما میتونین DLL مربوط به این عمل رو که کم هم نیست به کریستال اضافه کنین و بعد استفاده بشه... البته DLL هایی که میخوان توی کریستال استفاده بشن باید دارای شرایط خاصی باشن.
روش دیگه اینه که از توی بانک حروفی رو بسازین و به گزارش رد کنین.
راه دیگه هم اینه که از توی محیط برنامه نویسی این کار رو انجام بدین.

موفق باشید

----------


## hamed_bostan

> شما میتونین توی کریستال با Syntax زبان VB و C کدنویسی انجام بدین که البته در این مورد خاص منطقی نیست.


منظورتون vb.net , C#‎.net  هست؟ یا vba و c خودمون؟

----------


## sm

vb اون نزدیک به دات نت هست ولی C نه... خاصه

موفق باشید

----------


## شایان کدینگ

از چه نسخه کریستال ریپورت استفاده می کنی

اگر با کریستال 8.5 کار می کنی کافیه این فایل dll را در vb فعال کنی سپس در ریپورت مورد نظرت کد زیر را تایپ کنی
Dim a As New ConvertyAdadToHorof.ConvertAdadToHorofPrivate Sub Section9_Format (By Val pFormattingInfo As Object)Target field.SetText (a.Adad (Source field.Value))           End Sub

----------


## vb341

با این dll می تونین تو وی بی 6 با کریستال 9 کار مورد نظر رو انجام بدین

----------


## Hamid Reza Rahimi

به نام خدا 
دوستان سلام من در کریستال 10 یک چارتی درست کردم که در اون مثلا 400 رکورد وجود دارد. اما مشکل اینجاست که همه این رکورد ها در یک صفحه نمایش داده می شود. آیا راه حلی موجود می باشد که با نمودار مثل Detailes کریستال رفتار کرد و با پر شدن تعداد معینی رکورد ادامه چارت در صفحه های بعد نمایش داده شود. خیلی فوریه

----------


## aminpourazadeh

> چگونه می توان توسط فرمولا فیلد در کریستال ریپورت عدد را به حروف تبدیل کرد 
> یا 
> چگونه میتوانیم یک dll را به توابع کریستال ریپورت اضافه کرد


*نحوه تبدیل عدد به حروف در کریستال ریپورت?*

----------


## Hamed228

با این روش به راحتی هر عددی رو میشه تو خود کریستال به حروف گذاشت و احتیاجی به هیچ Dll و کد توی لرنامه نداره


Digit2Alpha ({sp_tbl_axCashHeadSql.Mablag}, 0) + Del + 'ريال'



'*************************************************  ********************
*   Creation Date : ?                                               *                   
'*************************************************  ********************   
'*  Modification History:                                            * 
*           a) this fuction always returned                         *
'*              "FixDigitToAlpha(FixPart) + " مميز " +                *  
'*              DecimalDigitToAlpha(DecimalPart) and if decimaldigit *
'*              part was null the "ممیز" was returned again and it was*
'*              wrong , so this problem was solved                   *
'*************************************************  ********************  
'Convert a number(integer or decimal) to farsi alphabet.
'Parameters: 1- Value: is the number should be convert.
'            2- CurrencyDecimal: digit of rounding.
Function Digit2Alpha (Value As Number,CurrencyDecimal As Number) As String
    Dim DecimalPart,FixPart As Number
    DecimalPart =  Value - Truncate(Value)
    FixPart = Truncate(Value)
    DecimalPart = Round (DecimalPart,CurrencyDecimal)    
    If(CurrencyDecimal = 0)Then
        If(DecimalPart = 1)Then
            FixPart = FixPart + 1
        End If            
        Digit2Alpha = FixDigitToAlpha(FixPart) 
    Else
        '1383-06-21 By A.Behnam: was Added this condition.        
        If DecimalDigitToAlpha(DecimalPart) <> "" Then
            Digit2Alpha = FixDigitToAlpha(FixPart) + " مميز " + DecimalDigitToAlpha(DecimalPart)
        Else
            Digit2Alpha = FixDigitToAlpha(FixPart) 
        End If
    End If

End Function


'*************************************************  ******************
'*   Creation Date : ?                                             *                   
'*************************************************  ******************   
'*  Modification History:                                          * 
'*           a) was checked if the input Parameter "value" was     *
'*              not null the body of function is done else         *
'*              it shouldn't be done .                             *
'*************************************************  ******************   
'Convert a 9 digital decimal number to farsi alphabet.
'This Function use by Digit2Alpha. 
'Parameter: 1- Value: is the number should be convert.
Function DecimalDigitToAlpha (Value As Number) As String
    Dim Str1,Str2,Result,s,Temp As String
    Dim i,ExterZero As Number
    '1383-06-21 By A.Behnam:was added "If Value <> 0 Then"  
    If Value <> 0 Then             
        Temp = ToText(Value ,10)
        For i =1 To 10 Step 1
            s = Mid(StrReverse(Temp),i,1)
            If(s = "0")Then
                ExterZero = ExterZero + 1
            Else 
                Exit For
            End if  
        Next i
        Str1 = Mid(Temp,3,(len(Temp) - ExterZero -2))
        Str2 =  FixDigitToAlpha(ToNumber(Str1))
        Select Case len(Str1) 
        Case 1
                Result = Str2 + " دهم " 
        Case 2
                Result = Str2 + " صدم " 
        Case 3
                Result = Str2 + " هزارم "
        Case 4
                Result = Str2 + " ده هزارم "
        Case 5
                Result = Str2 + " صد هزارم "
        Case 6
                Result = Str2 + " ميليونيم "
        Case 7
                Result = Str2 + " ده ميليونيم "
        Case 8
                Result = Str2 + " صد ميليونيم "

        End Select
        DecimalDigitToAlpha = Result 
       End If 
End Function


'Determine the actual decimals digits of Value
'Parameters: 1- Value: the number that will be determined the actual decimals digits of it. 
'            2- CurrencyDecimal: decimals digits that determine by user. 
Function DetermineDecimals (Value As Number,CurrencyDecimal As Number)As Number
    Dim CurrencyDecimalTemp As Number
    Dim i As Number
    Dim j As Number
    Dim k As Number
    CurrencyDecimalTemp = 0
    j = 1
    k = 1
    For i = 1 To CurrencyDecimal Step 1 
        if(Remainder (Value,j ))<> 0 Then
            CurrencyDecimalTemp = CurrencyDecimalTemp + 1
            k = k* 10
            j = 1/k
        else
            Exit For
        end if
    Next i
    DetermineDecimals = CurrencyDecimalTemp
End Function


'Convert a 3 digital number to farsi alphabet.
'This Function use by FixDigitToAlpha. 
'Parameter: 1- Value: is the number should be convert.
Function DigitCalassyfying (Num As Number) As String
    Dim s,harf As String
    Dim s1,s2,s3,l,i As Number
    s = ToText (Num,0)
    l = Len (s)
    If l<3 Then
        For  i=1 To 3-l Step 1
            s = "0" + s 
        Next i
    End If 
    s1 =  ToNumber (Mid (s,3,1))
    s2 =  ToNumber (Mid (s,2,1))
    s3 =  ToNumber (Mid (s,1,1))
    harf = " "
    Select Case s1 
    Case 1 
         harf = "يک"  
    Case 2 
         harf = "دو"  
    Case 3
          harf = "سه"  
    Case 4
          harf = "چهار"  
    Case 5
          harf = "پنج"  
    Case 6
          harf = "شش"  
    Case 7
          harf = "هفت"  
    Case 8
          harf = "هشت"  
    Case 9
          harf = "نه"  
    End Select
    's2
    Select Case s2 
    Case 1 
        Select Case s1 
            Case 0 
                 harf = "ده"  
            Case 1 
                 harf = "يازده"  
            Case 2
                  harf = "دوازده"  
            Case 3
                  harf = "سيزده"  
            Case 4
                  harf = "چهارده"  
            Case 5
                  harf = "پانزده"  
            Case 6
                  harf = "شانزده"  
            Case 7
                  harf = "هفده"  
            Case 8
                  harf = "هجده" 
            Case 9
                  harf = "نوزده"  
        End Select  
    Case 2 
        If(harf = "")Then
            harf = "بیست" + harf    
        Else
            harf = "بيست و " + harf
        End If 
    Case 3
        If(harf = "")Then
            harf = "سی" + harf    
        Else
            harf = "سی و " + harf
        End If   
    Case 4
        If(harf = "")Then
            harf = "چهل" + harf    
        Else
            harf = "چهل و " + harf
        End If 
    Case 5
        If(harf = "")Then
            harf = "پنجاه" + harf    
        Else
            harf = "پنجاه و " + harf
        End If 
    Case 6
           If(harf = "")Then
            harf = "شصت" + harf    
        Else
            harf = "شصت و " + harf
        End If 
    Case 7
           If(harf = "")Then
            harf = "هفتاد" + harf    
        Else
            harf = "هفتاد و " + harf
        End If 
    Case 8
        If(harf = "")Then
            harf = "هشتاد" + harf    
        Else
            harf = "هشتاد و " + harf
        End If 
    Case 9
           If(harf = "")Then
            harf = "نود" + harf    
        Else
            harf = "نود و " + harf
        End If 
    End Select
    's3
    Select Case s3 
    Case 1 
        If(harf = "")Then
            harf = "يکصد" + harf    
        Else
            harf = "يکصد و " + harf
        End If 
    Case 2 
        If(harf = "")Then
            harf = "دويست" + harf    
        Else
            harf = "دويست و " + harf
        End If 
    Case 3
        If(harf = "")Then
            harf = "سيصد " + harf    
        Else
            harf = "سيصد و " + harf
        End If   
    Case 4
        If(harf = "")Then
            harf = "چهارصد" + harf    
        Else
            harf = "چهارصد و " + harf
        End If 
    Case 5
        If(harf = "")Then
            harf = "پانصد" + harf    
        Else
            harf = "پانصد و " + harf
        End If 
    Case 6
           If(harf = "")Then
            harf = "ششصد" + harf    
        Else
            harf = "ششصد و " + harf
        End If 
    Case 7
           If(harf = "")Then
            harf = "هفتصد" + harf    
        Else
            harf = "هفتصد و " + harf
        End If 
    Case 8
           If(harf = "")Then
            harf = "هشتصد" + harf    
        Else
            harf = "هشتصد و " + harf
        End If 
    Case 9
          If(harf = "")Then
            harf = "نهصد" + harf    
        Else
            harf = "نهصد و " + harf
        End If 
    End Select
    DigitCalassyfying = Trim(harf)
End Function


'Convert a 15 digital number to farsi alphabet.
'This Function use by Digit2Alpha. 
'Parameter: 1- Value: is the number should be convert.
Function FixDigitToAlpha (Value As Number)As String
    Dim Separator,s , s1 , s2 , s3 , s4, s5, Part1, Part2, Part3, Part4, TotalParts As String
    Dim l,i,ZeroCounter As Number

    Part1 =" "
    Part2 =" "
    Part3 =" "
    Part4 =" "
    TotalParts  =" "
    Separator = " "
    s = ToText (Value,0)
    l = Len (s)
    If(l<20)Then 
        If(l>4)Then
            If(Not IsNumeric(Mid (s,(l-3),1)))Then
                Separator = Mid (s,(l-3),1)
                ZeroCounter = 19
            Else
                ZeroCounter = 15    
            End If          
        Else
            ZeroCounter = 15           
        End If
        If(ZeroCounter = 19)Then

            If(((l+1) mod 4)<> 0)Then
                For i=1 To 3-(l mod 4) Step 1
                    s = "0" + s
                Next i
            End If
            For  i=1 To (ZeroCounter-l)/4  Step 1 
                s =  "000" + Separator + s 
            Next i 

         Else           
            For  i=1 To ZeroCounter-l Step 1 
                s = "0" + s 
            Next i 
        End if

        If(l>4 And Separator <> " ")Then
            s1 = Mid (s,17,3)
            s2 = Mid (s,13,3)
            s3 = Mid (s,9,3)
            s4 = Mid (s,5,3)
            s5 = Mid (s,1,3)
        Else
            s1 = Mid (s,13,3)
            s2 = Mid (s,10,3)
            s3 = Mid (s,7,3)
            s4 = Mid (s,4,3)
            s5 = Mid (s,1,3)
        End If
        If Len(s1)< 3 Then 
            For  i=1 To 3-l Step 1 
                s1 = "0" + s1 
            Next i
        End If
        If Len(s2)< 3 Then 
            For  i=1 To 3-l Step 1 
                s2 = "0" + s2 
            Next i
        End If
        If Len(s3)< 3 Then 
            For  i=1 To 3-l Step 1 
                s3 = "0" + s3 
            Next i
        End If
        If Len(s4)< 3 Then 
            For  i=1 To 3-l Step 1 
                s4 = "0" + s4 
            Next i
        End If
        If Len(s5)< 3 Then 
            For  i=1 To 3-l Step 1 
                s5 = "0" + s5 
            Next i
        End If
        If (ToNumber (s5)<>0) Then 
            Part4 = DigitCalassyfying(ToNumber (s5)) + " تريليون "
        End If
        If (ToNumber (s4)<>0) Then 
            Part3 = DigitCalassyfying(ToNumber (s4)) + " ميليارد "
        End If
        If (ToNumber (s3)<>0) Then 
            Part2 = DigitCalassyfying(ToNumber (s3)) + " ميليون "
        End If
        If (ToNumber (s2)<>0) Then 
            Part1 = DigitCalassyfying(ToNumber (s2)) + " هزار "
        End If
        TotalParts = DigitCalassyfying(ToNumber (s1))
        If((Part1<>"") And (s1<>"000")) Then
            TotalParts = Part1 + "و" + TotalParts
        Else 
            TotalParts = Part1 + TotalParts
        End If

        If((Part2<>"") And (s2<>"000")) Or ((Part2<>"") And (s1<>"000")) Then
            TotalParts = Part2 + "و" + TotalParts
        Else 
            TotalParts = Part2 + TotalParts
        End If
        If((Part3<>"") And (s3<>"000")) Or ((Part3<>"") And (s2<>"000")) Or ((Part3<>"") And (s1<>"000"))Then
            TotalParts = Part3 + "و" + TotalParts
        Else 
            TotalParts = Part3 + TotalParts
        End If
         If((Part4<>"") And (s4<>"000")) Or ((Part4<>"") And (s3<>"000")) Or ((Part4<>"") And (s2<>"000")) Or ((Part4<>"") And (s1<>"000")) Then
            TotalParts = Part4 + "و" + TotalParts
        Else 
            TotalParts = Part4 + TotalParts
        End If        

    Else
        TotalParts = " "
    End If
    FixDigitToAlpha = Trim(TotalParts)
End Function

----------


## Alipersia

سلام 
دوستم من ميتوني يه راهنمايي كني چجوري از اين كد ها استفاده كنم؟

----------


## parvizfahimy

سلام.
من هم ممنون میشم نحوه استفاده از این کدها رو بگید.

----------


## parvizfahimy

بالاخره خودم فهیمیدم
اول یه کلاس تعریف میکنیم مثلا من lib تعریف کردم .بعد کد های صفحه قبلو تو کلاس کپی میکنی. فقط کافیه عددی که می خوای را بریزی تو تابع num2str.مثل کد زیر
البته برای دیدن حروف خروجی رو تو label1ریختم.
;int x=12330000

        this.label1.Text = lib.num2str(x.ToString());



        this.label1.Text = lib.num2str(x.ToString());

----------


## saeed-kh

در قسمت Field Explorer مربوط به فایل گزارشت روی Formula Fields کلیک راست کن و New(یک نام بده)
در کادر باز شده
CStr ({CLientParent.Cost})
CLientParent.Cost اسم فیلدی هست که رد دیتاست هست.
گزینه اضافه شده در Formula... رو به گزارش اضافه کن

----------


## mseplus

> در قسمت Field Explorer مربوط به فایل گزارشت روی Formula Fields کلیک راست کن و New(یک نام بده)
> در کادر باز شده
> CStr ({CLientParent.Cost})
> CLientParent.Cost اسم فیلدی هست که رد دیتاست هست.
> گزینه اضافه شده در Formula... رو به گزارش اضافه کن


سلام
کسی تبدیل تاریخ به حروف رو نداره؟؟؟

----------

