Aplicação de relatório iReport no Netbeans

Boa noite meus caros amigos,

Estou precisando muito de uma ajuda. Configurei o iReport corretamente e testei o banco de dados. Mas quando vou fazer a aplicação no netbeans 6.9.1. ocorre um erro. Abaixo segue o código:

[code]package laboratorioac;

import java.sql.Connection;
import java.sql.DriverManager;

/**
*

  • @author Elcio
    */
    public class ConexaoOracle {

    private static class e {

     private static void printStackTrace() {
         throw new UnsupportedOperationException("Not yet implemented");
     }
    
     public e() {
     }
    

    }
    //private String driver;

    public Connection getConnection(){

     try{
        //Class.forName(driver);
        String driver = "oracle.jdbc.driver.OracleDriver)";
        String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
        Connection con = DriverManager.getConnection(driver, "igm", "igm");
        return con;
     } catch (Exception e) {
         e.printStackTrace();
     } return null;
    

    }
    }
    [/code]

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */

/*

  • Mapatrab.java
  • Created on 30/09/2011, 20:39:44
    */

package laboratorioac;

import java.sql.Connection;
import java.util.Map;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.view.JasperViewer;

/**
*

  • @author Elcio
    */
    public class Mapatrab extends javax.swing.JFrame {

    private JasperViewer JasperViewer(JasperPrint jp) {
    throw new UnsupportedOperationException(“Not yet implemented”);
    }

    private static class Hashmap {

     public Hashmap() {
     }
    

    }

    /** Creates new form Mapatrab */
    public Mapatrab() {
    initComponents();
    }

private void visualisarActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
try{
Connection con = new ConexaoOracle().getConnection();
Hashmap parametros = new Hashmap();
JasperPrint jp = JasperFillManager.fillReport("./jasper/Mapatrab.jasper", (Map) parametros, con);
JasperViewer jrv = JasperViewer (jp);
jrv.setVisible(true);
}
catch (Exception e) {
e.printStackTrace();
}
}

private void pdfActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    try{
        Connection con = new ConexaoOracle().getConnection();
        Hashmap parametros = new Hashmap();
        JasperPrint jp = JasperFillManager.fillReport("./jasper/Mapatrab.jasper", (Map) parametros, con);
        JasperExportManager.exportReportToPdfFile(jp, "./Mapatrab.pdf");

    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

private void htmlActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    try{
        Connection con = new ConexaoOracle().getConnection();
        Hashmap parametros = new Hashmap();
        JasperPrint jp = JasperFillManager.fillReport("./jasper/Mapatrab.jasper", (Map) parametros, con);
        JasperExportManager.exportReportToHtmlFile(jp, "./Mapatrab.pdf");

    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

/**
* @param args the command line arguments
*/
public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new Mapatrab().setVisible(true);
        }
    });
}

// Variables declaration - do not modify
private javax.swing.JButton html;
private javax.swing.JLabel jLabel1;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JButton pdf;
private javax.swing.JButton visualisar;
// End of variables declaration

}
/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */

/*

  • Mapatrab.java
  • Created on 30/09/2011, 20:39:44
    */

package laboratorioac;

import java.sql.Connection;
import java.util.Map;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.view.JasperViewer;

/**
*

  • @author Elcio
    */
    public class Mapatrab extends javax.swing.JFrame {

    private JasperViewer JasperViewer(JasperPrint jp) {
    throw new UnsupportedOperationException(“Not yet implemented”);
    }

    private static class Hashmap {

     public Hashmap() {
     }
    

    }

    /** Creates new form Mapatrab */
    public Mapatrab() {
    initComponents();
    }

private void visualisarActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
try{
Connection con = new ConexaoOracle().getConnection();
Hashmap parametros = new Hashmap();
JasperPrint jp = JasperFillManager.fillReport("./jasper/Mapatrab.jasper", (Map) parametros, con);
JasperViewer jrv = JasperViewer (jp);
jrv.setVisible(true);
}
catch (Exception e) {
e.printStackTrace();
}
}

private void pdfActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    try{
        Connection con = new ConexaoOracle().getConnection();
        Hashmap parametros = new Hashmap();
        JasperPrint jp = JasperFillManager.fillReport("./jasper/Mapatrab.jasper", (Map) parametros, con);
        JasperExportManager.exportReportToPdfFile(jp, "./Mapatrab.pdf");

    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

private void htmlActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    try{
        Connection con = new ConexaoOracle().getConnection();
        Hashmap parametros = new Hashmap();
        JasperPrint jp = JasperFillManager.fillReport("./jasper/Mapatrab.jasper", (Map) parametros, con);
        JasperExportManager.exportReportToHtmlFile(jp, "./Mapatrab.pdf");

    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

/**
* @param args the command line arguments
*/
public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new Mapatrab().setVisible(true);
        }
    });
}

// Variables declaration - do not modify
private javax.swing.JButton html;
private javax.swing.JLabel jLabel1;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JButton pdf;
private javax.swing.JButton visualisar;
// End of variables declaration

}
[/code]

E esse próximo código é do Facade que já tenho na máquina. Pergunto. Uso o Facade ou o ConexaoOracle:

[code]import java.sql.SQLException;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import javax.swing.*;

public class Facade
{

String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
private static String usuario = "igm";
private static String senha = "igm";
private static Statement statement;
public static ResultSet resultset;
private Connection con;
private static Facade instance;

public static Facade getInstance() {
    if (instance == null) {
        instance = new Facade();
    }
    return instance;
}

public Connection conexao()
{
    con = null;
    try
    {
        Class.forName(driver);
        con = DriverManager.getConnection(url, usuario, senha);
    }
    catch(ClassNotFoundException Driver)
    {
       JOptionPane.showMessageDialog(null, "Facade - Driver não localizado: "+Driver);
       System.exit(0);
    }
    catch(SQLException Fonte)
    {
        JOptionPane.showMessageDialog(null,"Facade - Erro na conexão com a fonte de dados: "+Fonte);
        System.exit(0);
    }
    System.out.println("Conexao realizada com exito.");
    return con;

}

public int desconecta()
{
    try
    {
        con.close();
        return(0);
    }
    catch(SQLException fecha)
    {
        JOptionPane.showMessageDialog(null, "Facade - Não foi possível "+"fechar o banco de dados: "+fecha);
        return(1);
    }
}

public int executeSQL (String sql)
{
    System.out.println("Facade sql = "+sql);
    try
    {
        statement = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
        resultset = statement.executeQuery(sql);
        return(0);
    }
    catch(SQLException sqlex)
    {
        JOptionPane.showMessageDialog(null,"Facade - Não foi possível executar o comando sql, "+sqlex+", o sql passado foi "+sql);
        System.out.println("Facade - Não foi possível executar o comando sql, "+sqlex+", o sql passado foi "+sql);
        return(1);
    }
}

public int executeInsert (String sql)
{
    try
    {
        statement = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
        statement.executeUpdate(sql);
        return(0);
    }
    catch(SQLException sqlex)
    {
        JOptionPane.showMessageDialog(null,"Facade - Não foi possível executar o comando sql, "+sqlex+", o sql passado foi "+sql);
        return(1);
    }
}

public int executeUpdate (String sql)
{
    try
    {
        statement = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
        statement.executeUpdate(sql);
        return(0);
    }
    catch(SQLException sqlex)
    {
        JOptionPane.showMessageDialog(null,"Facade - Não foi possível executar o comando sql, "+sqlex+", o sql passado foi "+sql);
        return(1);
    }

}

Connection getConnection() {
    throw new UnsupportedOperationException("Not yet implemented");
}

}
[/code]

MENSAGEM DE ERRO DO NETBEANS

run:
Conexao realizada com exito.
Facade sql = Select * from Login where UPPER(Nome_Usuario) = ‘ELCIO’
O tamanho da tela é: 1280 pixels de largura por 800 pixels de altura.
java.sql.SQLException: No suitable driver found for oracle.jdbc.driver.OracleDriver)
at java.sql.DriverManager.getConnection(DriverManager.java:602)
at java.sql.DriverManager.getConnection(DriverManager.java:185)
at laboratorioac.ConexaoOracle.getConnection(ConexaoOracle.java:34)
at laboratorioac.Mapatrab.visualisarActionPerformed(Mapatrab.java:177)
at laboratorioac.Mapatrab.access$000(Mapatrab.java:25)
at laboratorioac.Mapatrab$1.actionPerformed(Mapatrab.java:111)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6267)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6032)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
java.lang.ClassCastException: laboratorioac.Mapatrab$Hashmap cannot be cast to java.util.Map
at laboratorioac.Mapatrab.visualisarActionPerformed(Mapatrab.java:179)
at laboratorioac.Mapatrab.access$000(Mapatrab.java:25)
at laboratorioac.Mapatrab$1.actionPerformed(Mapatrab.java:111)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6267)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6032)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
CONSTRUÍDO COM SUCESSO (tempo total: 3 minutos 27 segundos)

Desde já agradeço,

Elcio

[color=red]No suitable driver found for oracle.jdbc.driver.OracleDriver[/color]

O driver do Oracle não está no classpath da sua aplicação. Baixe o driver e configure essa dependência no seu projeto dentro do NetBeans.

[]'s

Bom dia David Buzzato,

Primeiramente muito obrigado pela resposta e parabéns pelo seu blog, estou nesse exato momento copiando as configurações para iReport e aplicação no netbeans.

Pergunto:

Esse driver não tem nada haver com a biblioteca Oracle driver que está no netbeans 6.9.1. Porque se for eu tenho ele. Se não é esse onde encontro esse driver. A princípio, estou usando o oracle 10 g e o meu windows é seven.

Desde já agradeço,

Elcio

Boa tarde David Buzzato ou quem possa me ajudar,

Fiz algumas mudanças na classe Facade e Mapatraba. Mas está aparecendo alguns erros no mapatrab. Segue código abaixo:

PUBLIC CONNECTION DENTRO DA CLASSE FACADE.JAVA

public Connection getConnection() { try{ Class.forName ("oracle.jdbc.driver.OracleDriver"); //String Driver = "jdbc:oracle:thin:@127.0.0.1:1521:xe"; //Connection con = DriverManager.getConnection(driver, "igm", "igm"); return con; } catch (Exception e) { e.printStackTrace(); } return null; }

CLASSE MAPATRAB.JAVA

[code]package laboratorioac;

import java.sql.Connection;
import java.util.Map;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.view.JasperViewer;

/**
*

  • @author Elcio
    */
    public class Mapatrab extends javax.swing.JFrame {

    private static class Hashmap {

     public Hashmap() {
     }
    

    }

    /** Creates new form Mapatrab */
    public Mapatrab() {
    initComponents();

    }

private void visualisarActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
try{
Connection con = new Facade().getConnection();
Hashmap parametros = new Hashmap();
JasperPrint jp = JasperFillManager.fillReport("./jasper/Mapatrab.jasper", (Map) parametros, con);
JasperViewer jrv = new JasperViewer (jp);
jrv.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}

private void pdfActionPerformed(java.awt.event.ActionEvent evt) {                                    
    // TODO add your handling code here:
    try{
        Connection con = new Facade().getConnection();
        Hashmap parametros = new Hashmap();
        JasperPrint jp = JasperFillManager.fillReport("./jasper/Mapatrab.jasper", (Map) parametros, con);
        JasperExportManager.exportReportToPdfFile(jp, "./Mapatrab.pdf");
    }   catch (Exception e) {
        e.printStackTrace();
    }
}                                   

private void htmlActionPerformed(java.awt.event.ActionEvent evt) {                                     
    // TODO add your handling code here:
    try{
        Connection con = new Facade().getConnection();
        Hashmap parametros = new Hashmap();
        JasperPrint jp = JasperFillManager.fillReport("./jasper/Mapatrab.jasper", (Map) parametros, con);
        JasperExportManager.exportReportToHtmlFile(jp, "./Mapatrab.pdf");
    }   catch (Exception e) {
        e.printStackTrace();
    }
}                                    

/**
* @param args the command line arguments
*/
public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new Mapatrab().setVisible(true);
        }
    });
}

// Variables declaration - do not modify                     
private javax.swing.JButton html;
private javax.swing.JLabel jLabel1;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JButton pdf;
private javax.swing.JButton visualisar;
// End of variables declaration                   

}
[/code]

MENSAGEM DE ERRO DO NETBEANS

run:
Conexao realizada com exito.
Facade sql = Select * from Login where UPPER(Nome_Usuario) = ‘ELCIO’
O tamanho da tela é: 1280 pixels de largura por 800 pixels de altura.
java.lang.ClassCastException: laboratorioac.Mapatrab$Hashmap cannot be cast to java.util.Map
at laboratorioac.Mapatrab.visualisarActionPerformed(Mapatrab.java:180)
at laboratorioac.Mapatrab.access$000(Mapatrab.java:25)
at laboratorioac.Mapatrab$1.actionPerformed(Mapatrab.java:112)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6267)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6032)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
CONSTRUÍDO COM SUCESSO (tempo total: 5 minutos 26 segundos)

Peço por gentileza que me ajudem,

Desde já agradeço,

Elcio

PS. Em relação ao driver do Oracle, consegue o ojdbc14.jar e já instalei no classpath. Mas mesmo assim está ocrrendo esse erro acima.

[color=red]java.lang.ClassCastException: laboratorioac.Mapatrab$Hashmap cannot be cast to java.util.Map [/color]

Você está fazendo um cast ilegal. Vc está tentando fazer um cast da sua classe Hashmap (não entendi pq vc criou ela) para um Map.

[]'s

Elcio,

Remova sua classe interna “Hashmap” e passe uma instância de java.util.HashMap no método fillReport:

Map<String, Object> parametros = new HashMap<String, Object>();
JasperPrint jp = JasperFillManager.fillReport("./jasper/Mapatrab.jasper", parametros, con); 

Neste objeto você consegue enviar parâmetros para seu relatório, como por ex. Locale, path para imagens, subrelatórios, etc.

Bom dia Senhores,

Vou tentar por aqui

Agradeço muito a compreensão de todos.

Assim que eu testar envio uma resposta se está resolvido.

Muito obrigado,

Elcio

arrume a sua String do driver esta assim, com um parentes no final:

[code] public Connection getConnection(){

    try{  
       //Class.forName(driver);  
       String driver = "oracle.jdbc.driver.OracleDriver)";  
       String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";  
       Connection con = DriverManager.getConnection(driver, "igm", "igm");  
       return con;  
    } catch (Exception e) {  
        e.printStackTrace();  
    } return null;  
      
}  [/code]

Deve ficar assim:

[code] public Connection getConnection(){

    try{  
       //Class.forName(driver);  
       String driver = "oracle.jdbc.driver.OracleDriver";  
       String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";  
       Connection con = DriverManager.getConnection(driver, "igm", "igm");  
       return con;  
    } catch (Exception e) {  
        e.printStackTrace();  
    } return null;  
      
}  [/code]

Obrigado abelhajr,

Vou arrumar

Boa tarde David Buzzato,

Infelizmente não consegui acertar aqueles erros no qual estão aparecendo. Você está usando Plugin for NetBeans IDE 3.x. A versão que foi atual do iReport 3.7.5. na época. Então pergunto:

  1. Devo baixar a mesma versão que mostra no tutorial para fazer as configurações?
  2. Preciso baixar somente o Plugin for netbeans ide 3.x ou baixo também o installer?

Na minha máquina tenho somente o iReport 4.0.2. Pergunto:

  1. Devo baixar o Plugin for netbeans ide 6.x e fazer as configurações conforme o tutorial?
  2. Devo baixar o Plugin iReport for NetBeans IDE 6.5.x 4.1.1 e o iReport 4.1.1 installer e seguir o tutorial?
  3. Devo baixar o Plugin e installer mais recente e seguir as configurações do tutorial?

Ou nada disso que coloquei faz sentido do erro que estava causando.

Desde já agradeço,

Elcio