الوقت/التاريخ الآن هو الجمعة أبريل 19, 2024 10:55 am

2 نتيجة بحث عن ResultSet

انشاء تقارير JasperReports مع iReport ...مقال 7 _التعامل مع مصادر البيانات_قاعدة البيانات كمصدر للبيانات ..3_ملىء التقرير باستخدام الكائن JRResultSetDataSource

أهلا وسهلا بكم إخواني الكرام

فى مقالات سابقة تكلمنا عن مصادر البيانات التى تستخدم فى استخراج بيانات التقرير من قاعدة بيانات علائقية Access ,MySql ,Oracl,mogo,SQL SERVER الخ , و أوضحنا أن ذلك يتم من خلال طريقتين :


  1. الاولى : بتضمين إستعلامات SQL في قالب تقرير JRXML سواء إن تم ذلك بإستخدام الشفرة أو تم ذلك عن طريق المعالج
  2. الثانية :  بتمرير البيانات من قاعدة البيانات إلى التقرير بإستخدام #JRResultSetDataSource


وقد قمنا بشرح الطريقة الاولى لذلك فى هذا المقال سنركز بالشرح على الطريقة الثانية وكيفية استخدام JDBC DataSources فى استخراج بيانات التقرير من قاعدة البيانات لذلك قبل أن نبدء ندعونا نفترض أن لدينا قاعدة بيانات باسم Employees وتحتوي على جدول باسم Info بالحقول التالية :


INTEGERId
VARCHARName
VARCHARJob


هذا الجدول يحتوى على البيانات التالية :


الوسم resultset على المنتدى منتدى مصر التقني 127532907

الفئة #JRResultSetDataSource هى احد الفئات التى توفرها المكتبة #JasperReports من خلال الواجهة JRDataSource لملْ و استخراج بيانات التقرير من قاعدة بيانات علائقية وذلك عن طريق تمرير الكائن java.sql.ResultSet اليها وذلك على النحو التالى :

الخطوة الاولى :إفتح ملف #xml لإنشاء الحقول #field التي سيتم ملؤها في وقت التشغيل من جدول قاعدة البيانات لاستخدامها فيما بعد و يجب أن تتطابق أسماء الحقول مع اسم العمود جدول البيانات أو الاسم المقابل له  في جملة الاستعلام SQL مع تحديد نوع بيانات الحقل int,string_على النحو التالى :

الكود:

<field name="ID" class="java.lang.Integer"></field>

 <field name="NAME" class="java.lang.String"></field>

<field name="JOB" class="java.lang.String"></field>



الخطوة الثانية :إنشاء العنصر #textField وهو العنصر الرسومي الذى يستخدم في عرض البيانات النصية الديناميكية في التقارير ويتم إنشائة باستخدام التعليمة <textField> بالشفرة التالية :

الكود:
<textField>
 <reportElement x="393" y="17" width="100" height="20"/>
 <textFieldExpression><![CDATA[$F{ID}]]></textFieldExpression>
 </textField>
 <textField>
 <reportElement x="393" y="37" width="100" height="20"/>
 <textFieldExpression><![CDATA[$F{NAME}]]></textFieldExpression>
 </textField>
 <textField>
 <reportElement x="393" y="57" width="100" height="20"/>
 <textFieldExpression><![CDATA[$F{JOB}]]></textFieldExpression>
 </textField>


و يمكنك ملاحظة أن :

  • التعليمة <reportElement> التى تحدد و تشير إلى ارتفاع حقل النص ،العرض والإحداثيات داخل النطاق   x و y....الخ
  • التعليمة <textFieldExpression> التى تحدد حقول البيانات التي سيتم عرضها في هذا العنصر النصي باستخدام




الكود:
$ F {field_name}



، حيث field_name هو اسم الحقل الذى تم تعريفة فى الخطوة السابقة >>>وهكذا يكون ملف xml كما فى الشكل التالى وجاهز لاستقبال البيانات :

الوسم resultset على المنتدى منتدى مصر التقني 127452649

ملحوظة :

يمكنك الاستغناء عن كتابة الشفرات فى الخطوة الاولى و الثانية اعلاه و إستخدام الواجهة الرسومية إنشاء حقول البيانات في ملف xml تلقائا  بدون كتابة اى شفرات على النحو التالى :

_ من نافذة #Report Inspector قم بتحديد  #Fields ثم النقر بزر الفارة الايمن لتظهر لك قائمة أختر منها الامر add Field كما فى الشكل التالى :
الوسم resultset على المنتدى منتدى مصر التقني 552574247

_سيظهر لك حقل باسم #field1 يمكنك تحديدة ومن نافذة الخصائص للحقول غير اسم الحقل باسم اعمدة جدول البيانات لديك أو باسم اعمدة الجدول فى جملة الاستعلام sql التى ستنفذ على النحو التالى :

الوسم resultset على المنتدى منتدى مصر التقني 470530950

_الان يمكن سحب و إفلات الحقول الثلاثة الى التقرير كما هو موضح فى الصورة التالية :



الوسم resultset على المنتدى منتدى مصر التقني 340922894

الخطوة الثالثة والاخيرة :عرض و تشغيل التقرير وذلك بتمرير البيانات التى تم جلبها من قاعدة البيانات باستخدام الكائن java.sql.ResultSet إلى التقرير بتمرير الكائن  #ResultSet الى الكائن #JRResultSetDataSource على النحو التالى :

الكود:

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.view.JasperViewer;

public class NewMain {

  
    
   public  void FillReport(){
    
      
            
            String host = "jdbc:derby://localhost:1527/Employees";
            String username = "US";
            String password = "US";
            Connection con=null;
            
            
            try {
                
                //إنشاء نص الاتصال بقاعدةالبيانات
                con = DriverManager.getConnection( host, username, password );
                
                // إنشاء جملة الاستعلام
                String SQL = "select * from US.Info";
                
                // إنشاء كائن التنفيذ
                Statement stmt = con.createStatement( );
                
                
                // إنشاء الكائن ResultSet و تنفيذ الاستعلام
                ResultSet rs = stmt.executeQuery( SQL );
                
                //الحصول على مسار التقرير
                InputStream Report =this.getClass().getResourceAsStream("/report/pppp.jasper");
                
                //تعبئة التقرير من قاعدة البيانات باستخدام الكائن JRResultSetDataSource
                JasperPrint jasperPrint = JasperFillManager.fillReport(Report,null,new JRResultSetDataSource(rs));
                
                //تشغيل وعرض التقرير
                JasperViewer.viewReport(jasperPrint,false);
                
                
            } catch (SQLException ex) {
                Logger.getLogger(NewMain.class.getName()).log(Level.SEVERE, null, ex);
            } catch (JRException ex) {
                Logger.getLogger(NewMain.class.getName()).log(Level.SEVERE, null, ex);
            }
            

        
        
      
   }
    
  
    public static void main(String[] args) {
        
       new NewMain().FillReport();
  
    }
}
من طرف أحمد مناع
في الجمعة سبتمبر 20, 2019 9:57 am
 
ابحث في: إنشاء التقارير JasperReports مع iReport
موضوع: انشاء تقارير JasperReports مع iReport ...مقال 7 _التعامل مع مصادر البيانات_قاعدة البيانات كمصدر للبيانات ..3_ملىء التقرير باستخدام الكائن JRResultSetDataSource
المساهمات: 1
مشاهدة: 1739

[JDBC]الاتصال بقواعد بيانات MS Access فى Java 8 باستخدام UcanaccessDriver

اهلا بكم 

منذ عدة سنوات كتب مقال عن [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] لكن من بداية الاصدار الثامن للجافا تمت إزالة  JDBC-ODBC من Java SE 8 و بالتالى فهو لم يعد مدعوم من قبل الجافا وذلك لا سباب عدة منها مثلا :

_لا يعمل [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] بشكل صحيح مع قواعد بيانات [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] عندما يحتوي النص على أحرف [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] بنقاط تعليمات برمجية أعلى U+00FF ، لذا فإن هذا الإعداد لن يكون قادراً على التعامل مع أحرف مثل اليونانية والروسية والصينية والعربية وغيرها

_سائق الاتصال [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] تم انتاجة من قبل [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] و بالتالى فهو يعمل فقط فى انظمة [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] وهناك إصدارات منفصلة 32 بت و 64 بت من Access Database Engine (وبرنامج تشغيل ODBC) التي يمكن أن تكون مصدر إزعاج نشر و توزيع تطبيقك.

لذلك في هذه المقالة ، سوف نتعلم الخطوات الازمة للاتصال بقاعدة بيانات MS Access في Java 8 وذلك من خلال سائق الاتصال الجديد [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]

الخطوة الاولى : تحميل سائق الاتصال ucanaccess

[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] هو سائق تشغيل Java JDBC خالص يتيح لنا القراءة والكتابة إلى قواعد بيانات [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] بدون استخدام [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]. ويستخدم حزمتين أخريين هما [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] و [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]

ويمكنك تحميل هذا السائق من العنوان التالى :

[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]

بعد تحميل الملف المضغوط قم بفك الضغط ليظهر لك الملفات التالية :

ucanaccess-4.0.1.jar  
 /lib/
   commons-lang-2.6.jar  
   commons-logging-1.1.1.jar  
   hsqldb.jar  
   jackcess-2.1.6.jar  

الخطوة الثانية : إضافة المكتبات اعلاه الى بيئة التطوير

كل ما عليك القيام به هو إضافة جميع (5) JARs إلى مشروعك من خلال بيئة التطوير الخاصة بك و ذلك على النحو التالى :

1_Eclipse

انقر بزر الماوس الأيمن فوق المشروع ثم أختر الامر "Package Explorer" من القائمة التى ستظهر اختر "Build Path"> "Configure Build Path" .... انقر فوق الزر "Add External JARs" لإضافة كل من JARs خمس (5). عند الانتهاء ، يجب أن يظهر Java Build Path على هذا النحو :

الوسم resultset على المنتدى منتدى مصر التقني UZOjj

2_NetBeans

قم بالنقر بزر الماوس الأيمن على مجلد "Libraries" واختر "Add JAR / Folder ..." ، ثم استعرض إلى ملف JAR

الوسم resultset على المنتدى منتدى مصر التقني DVN3d

لتظهر لك الملفات بالشكل التالى :

الوسم resultset على المنتدى منتدى مصر التقني E5FKa


3_IntelliJ IDEA

من خلال القائمة File > Project Structure ...أختر الامر Libraries ثم انقر فوق الزر "إضافة" (+) وأضف ملفات JAR الخمسة (5). وبمجرد الانتهاء من ذلك ، يجب أن يبدو المشروع كالتالي:

الوسم resultset على المنتدى منتدى مصر التقني AnOp5

الخطوة الثالثة : شفرة الاتصال بقاعدة بيانات أكسس من خلال ucanaccess

مجرد أن نكون قد اتممنا الخطوات المذكورة أعلاه ثم يمكننا المضي قدما فى كتابة الشفرة الخاصة بالاتصال بقاعدة بيانات MS Access database
...لذلك سنفترض فى المثال التالى أن قاعدة البيانات المراد الاتصال بها تسمي Player.accdb ....ثم اتبع الخطوات التالية :

1_ قم بنقل قاعدة البيانات Player.accdb التى قمت بإنشائها و المراد الاتصال بها الى المجلد الرئسيى للمشروع الذى قمت بإنشائة من خلال

2_نقوم استدعاء جميع الدوال التابعه للمكتبه [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] و ايضا ادراج المكتبه التي تتعامل مع صناديق الحوار [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] كما تعلمنا سابقا و على النحو التالى :

الكود:

import java.sql.*;
import javax.swing.JOptionPane;


3_الاعلان عن الكائنات التى تستخدم لاتمام عملية ربط قاعدة البيانات مع البرنامج باستخدام الكائنات كما تعلمنا سابقا وهى : الكائن [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] وهو الخاص بنص الاتصال ...الكائن [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] وهو الخاص بجمل التحكم ....و الكائن [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] وهو الخاص بمؤشر البيانات وذلك عن طريق الكود التالى :

الكود:
Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;


4_نقوم بكتابة الكود التالى لتحميل JDBC Driver الخاص بقواعد البيانات اكسس و ذلك على النحو التالى :

الكود:
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");


كما فى السطر السابق قمن باستدعاء الطريقة [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] وذلك لتحميل الفصيلة [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] التي تحتوي على مشغل قاعدة البيانات ...و تحميل هذه الفصيلة قد يتسببفي حدوث استثناء في حالة أن الفصيلة المطلوبة لا يمكن تحميلها وهذا الاستثناء هو [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] و بالتالى سنقوم بمعالجة هذا الاستثناء بالتعديل على الكود اعلاه على النحو التالى :

الكود:
try {
 
            Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
        }
        catch(ClassNotFoundException cnfex) {
 
            
           JOptionPane.showMessageDialog(null,cnfex.getMessage());
          
        }


5_نقوم بأستدعاء الطريقة [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] الموجودة فى الفصيلة [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] مع تمرير عنوان او رابط ملف قاعدة البيانات  Player.accdb  الية و ذلك عن طريق الكود التالى :

الكود:
String msAccDB = "/Player.accdb";
            String dbURL = "jdbc:ucanaccess://"+ msAccDB;
            
            connection = DriverManager.getConnection(dbURL);


يقوم هذا السطر بعملية اتصال بقاعدة البيانات عن طريق نص الاتصال dbc:ucanaccess://"+ msAccDB ثم وضعنا أسم قاعدة البيانات Player.accdb فى المتغير  [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] ولكن في حالة عدم القدرة على الاتصال بقاعدة البيانات سيحدث الاستثناء SQLException لذلك سوف يتم معالجة كما فعلنا فى الدرس السابق .

6_نقوم بإستدعاء الطريقة [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] لايجاء الكائن [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] والذي سيستخدم للاستعلام من قاعدة البيانات وذلك عن طريق الكود التالى :
الكود:
statement = connection.createStatement();


7_نفيذ الاستعلام من خلال استدعاء الطريقة [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] الموجودة فى الصنف [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] و الذى قد عبرنا عنه بالكائن [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] و ذلك على النحو التالى :

الكود:
resultSet = statement.executeQuery("SELECT * FROM PLAYER");


8_حلقة دوران للحصول على قيم جدول البيانات ومعالجة البيانات التي تم إرجاعها ومن ثم طباعتها على النحو التالى :

الكود:
while(resultSet.next()) {
                System.out.println(resultSet.getInt(1) + "\t" +
                        resultSet.getString(2) + "\t" +
                        resultSet.getString(3) + "\t" +
                        resultSet.getString(4));
            }


الشفرة بالكامل على النحو التالى :

الكود:

import java.sql.*;
import javax.swing.JOptionPane;


public class DoConnect {
    
public static void main(String[] args) {
 
        // variables
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
 
        
        try {
 
            Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
        }
        catch(ClassNotFoundException cnfex) {
             JOptionPane.showMessageDialog(null,cnfex.getMessage());
        }
        try {
 
            String msAccDB = "/Player.accdb";
            String dbURL = "jdbc:ucanaccess://"+ msAccDB;
            
            connection = DriverManager.getConnection(dbURL);
 
            statement = connection.createStatement();
 
            resultSet = statement.executeQuery("SELECT * FROM PLAYER");
 
            System.out.println("ID\tName\t\t\tAge\tMatches");
            System.out.println("==\t================\t===\t=======");
 
          
            while(resultSet.next()) {
                System.out.println(resultSet.getInt(1) + "\t" +
                        resultSet.getString(2) + "\t" +
                        resultSet.getString(3) + "\t" +
                        resultSet.getString(4));
            }
        }
        catch(SQLException sqlex){
            sqlex.printStackTrace();
        }
        finally {
            
            try {
                if(null != connection) {
                    
                    resultSet.close();
                    statement.close();
                   connection.close();
                }
            }
            catch (SQLException sqlex) {
                sqlex.printStackTrace();
            }
        }
    }
    
}



تحياتى لكم
من طرف أحمد مناع
في الجمعة فبراير 08, 2019 2:03 pm
 
ابحث في: قواعد البيانات JAVA JDBC
موضوع: [JDBC]الاتصال بقواعد بيانات MS Access فى Java 8 باستخدام UcanaccessDriver
المساهمات: 1
مشاهدة: 2892

الرجوع الى أعلى الصفحة

انتقل الى: