Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - S4ms3pi0l__

#1
Tengo la gran duda de cómo obtengo la cantidad de días de la siguiente cadena de texto: "Se otorga bono por cierre a las 02 am los días 22, 23 y 24 de febrero".

Me gustaría saber cómo obtengo esos tres valores (22, 23 y 24) para mostrar la cantidad de días, que en este caso la respuesta sería 3. Y asimismo cuando tenga uno, dos o más días. No adjunto código porque no sé por dónde o cómo empezar.
#2
Bueno, tengo como tarea realizar una aplicación que sea capaz de leer una función matemática (seno, coseno, variables, etc) y resolver cierto ejercicio (en este caso, el error aproximado a la raíz por medio del método de bisección), sin embargo, no tengo ni la más remota idea de cómo hacerlo (leer la función).

Entonces, lo único que solicito es que me guíen por el camino correcto para poder resolver esto, y si son súper generosos, compartirme un ejemplo.
#3
Tengo el siguiente error: "java.lang.ClassCastException: java.lang.Byte cannot be cast to java.lang.Integer" cuando en ninguna parte tengo declarada alguna variable del tipo Byte. Lo mismo sucede con las otras dos líneas siguientes.

Código (java) [Seleccionar]

private void Cargar4()
   {
       Session s = NewHibernateUtil.getSessionFactory().openSession();
        try
       {  
           Query query =  s.createQuery("select\n" +
                                       "   c.categoryId as idCategoria,\n" +
                                       "   c.name as nombre,\n" +
                                       "   count(*) as Cantidad\n" +
                                       "from Category c\n" +
                                       "inner join c.filmCategories fc\n" +
                                       "group by c.name");
           
           List<Object[]> res = query.list();
           List<PeliculaC> elist = new ArrayList<PeliculaC>();
           Iterator it = res.iterator();
           while(it.hasNext()){
               Object[] line = (Object[]) it.next();
               PeliculaC pc = new PeliculaC();
               pc.setIdCategoria((int) line[0]); //Esta es la línea donde me indica el error
               pc.setNombre((String) line[1]); //java.lang.Long cannot be cast to java.lang.String
               pc.setCantidad((int) line[2]); //java.lang.Byte cannot be cast to java.lang.Integer
               elist.add(pc);
           }
      }catch( Exception io)
       {     JOptionPane.showMessageDialog(null, "Fallo de conexion: "+io.toString());
           
       }finally
       {  
           s.close();    
       }
   }


Espero puedan ayudarme.
#4
Me gustaría algo de ayuda para resolver ese problemita de casteo. Se supone que, lo que tengo aquí:

Código (java) [Seleccionar]

String hql = "select\n" +
                    "    c.categoryId as IdCategoria,\n" +
                    "    c.name as nombre,\n" +
                    "    count(*) as Cantidad\n" +
                    "from Category c\n" +
                    "inner join c.filmCategories fc\n" +
                    "group by c.name";

       Iterator iterador  = s.createQuery(hql).list().iterator();
       
        while(iterador.hasNext()) {
            Object obj[] = (Object[]) iterador.next();
            System.out.println(obj[0]+" - "+obj[1] +" - "+obj[2]);
        }


Se tiene que mostrar en un reporte usando Jasper-Reports. Tengo la siguiente clase que manda a imprimir en el reporte, los elementos de la consulta:

Código (java) [Seleccionar]

public class CategoriaPelicula implements JRDataSource{
    private List<PeliculaC> lista4 = new ArrayList<PeliculaC>();
    private int indiceFact = -1;
   
    @Override
    public boolean next() throws JRException {
        return ++indiceFact < lista4.size();
    }

    @Override
    public Object getFieldValue(JRField jrf) throws JRException {
         Object valor = null;
         
         
         if("IdCategoria".equals(jrf.getName()))
       {
           valor = String.valueOf(lista4.get(indiceFact).getIdCategoria());
       }
       if("Nombre".equals(jrf.getName()))
       {
           String x = lista4.get(indiceFact).getNombre();
           valor = x;
       }
       if("Cantidad".equals(jrf.getName()))
       {
           valor = String.valueOf(lista4.get(indiceFact).getCantidad());
       }
       
       return valor;
    }
    /*El problema está en esta parte*/
    public void addPeliculaC(PeliculaC c){
        this.lista4.add(c);
    }
   /**/
    public void Limpiar(){
        if(indiceFact == -1)
            indiceFact = -1;
        else
            indiceFact -= 1;
    }
}



Y aquí es donde ejecuto la consulta para mi reporte:

Código (java) [Seleccionar]

private void Cargar4()
    {
        Session s = NewHibernateUtil.getSessionFactory().openSession();
         try
        {   
            Query query =  s.createQuery("select\n" +
                                        "    c.categoryId as idCategoria,\n" +
                                        "    c.name as nombre,\n" +
                                        "    count(*) as Cantidad\n" +
                                        "from Category c\n" +
                                        "inner join c.filmCategories fc\n" +
                                        "group by c.name");//.setResultTransformer(Transformers.aliasToBean(PeliculaC.class));
           
           
            List<PeliculaC> elist = query.list();
           
              for (PeliculaC e: elist)
            {
               DataSource4.addPeliculaC(e);
            }
       }catch( Exception io)
        {     //JOptionPane.showMessageDialog(null, "Fallo de conexion: "+io.toString());
            System.out.println("Fallo de conexion" + io.toString());
        }finally
        { 
            s.close();   
        }
    }


En resumen, lo que tengo de primero, tengo que transformarlo para imprimirlo en mi reporte de Jasper, pero he intentado de todo y sigo sin resolver ese problema. Espero puedan ayudarme.
#5
Cita de: EdePC en  7 Abril 2019, 03:38 AM
Saludos,

- Yo lo estoy entendiendo así:

-- Seleccionar a todos los clientes que hayan realizado más de 5 órdenes por año.
-- Presentar el detalle de las cantidad por año. Ordenar por año

Código (sql) [Seleccionar]
SELECT
  CustomerID,
  YEAR(OrderDate) AS Año,
  COUNT(OrderID)  AS Cantidad
FROM Orders
GROUP BY YEAR(OrderDate), CustomerID
HAVING COUNT(OrderID) > 5
ORDER BY Año


+------------+------+----------+
| CustomerID | Año  | Cantidad |
+------------+------+----------+
| ERNSH      | 1996 |        6 |
| QUICK      | 1996 |        6 |
| RATTC      | 1996 |        6 |
| AROUT      | 1997 |        7 |
| BERGS      | 1997 |       10 |
| BLONP      | 1997 |        7 |
| BONAP      | 1997 |        8 |
| BSBEV      | 1997 |        6 |
| ERNSH      | 1997 |       15 |
| FOLKO      | 1997 |        7 |
| FRANK      | 1997 |        8 |
| GOURL      | 1997 |        7 |
| GREAL      | 1997 |        6 |
| HILAA      | 1997 |       10 |
| HUNGO      | 1997 |       10 |
| KOENE      | 1997 |        8 |
| LAMAI      | 1997 |        8 |
| LEHMS      | 1997 |        8 |
| MEREP      | 1997 |       10 |
| OTTIK      | 1997 |        6 |
| PICCO      | 1997 |        6 |
| QUEEN      | 1997 |        7 |
| QUICK      | 1997 |       14 |
| RATTC      | 1997 |        6 |
| REGGC      | 1997 |        6 |
| SAVEA      | 1997 |       17 |
| VAFFE      | 1997 |        6 |
| WARTH      | 1997 |       10 |
| WHITC      | 1997 |        8 |
| BONAP      | 1998 |        6 |
| BOTTM      | 1998 |        8 |
| ERNSH      | 1998 |        9 |
| FOLKO      | 1998 |        9 |
| GODOS      | 1998 |        7 |
| HANAR      | 1998 |        7 |
| HILAA      | 1998 |        6 |
| LINOD      | 1998 |        7 |
| QUICK      | 1998 |        8 |
| RATTC      | 1998 |        6 |
| SAVEA      | 1998 |       11 |
| SUPRD      | 1998 |        6 |
+------------+------+----------+


Sí, está perfecto. Al final, creo que, lo terminaste simplificando. Muchas gracias por tu ayuda ;D
#6
Tengo el siguiente problema: Seleccionar a todos los clientes que hayan realizado más de 5 órdenes por año. Presentar el detalle de las cantidad por año. Ordenar por año.

Esto es lo que yo hice y que no sé si está correcto:

Código (sql) [Seleccionar]

ALTER PROCEDURE SP_TopClientes
AS
CREATE TABLE #HistorialCantidad(
--IdHistorial int primary key identity(0,1),
Nombre varchar(100),
Año int,
Cantidad int
)
CREATE TABLE #Año(
Id int primary key identity(0,1),
Año int
)
INSERT INTO #Año
SELECT DISTINCT YEAR(OrderDate) FROM Orders
DECLARE @Contador int
SET @Contador = 0
WHILE(@Contador < (SELECT COUNT(*) FROM #Año))
BEGIN
INSERT INTO #HistorialCantidad
SELECT DISTINCT TOP 5
c.CompanyName as [Nombre Compañía],
YEAR(o.OrderDate) as Año,
COUNT(*) AS Cantidad
FROM [Order Details] od
INNER JOIN Orders o ON o.OrderID = od.OrderID
INNER JOIN Customers c ON c.CustomerID = o.CustomerID
WHERE YEAR(o.OrderDate) = (SELECT Año from #Año WHERE Id = @Contador)
GROUP BY c.CompanyName, YEAR(o.OrderDate)
ORDER BY Cantidad DESC

SET @Contador = @Contador+1
END
SELECT * FROM #HistorialCantidad ORDER BY Año, Cantidad
DROP TABLE #HistorialCantidad
DROP TABLE #Año


Espero puedan ayudarme.
#7
Tengo la siguiente consulta usando la misma base de datos de mi post anterior:

https://foro.elhacker.net/bases_de_datos/ayuda_con_una_consulta_usando_procedimientos_almacenados-t493882.0.html

Realizar un procedimiento almacenado que reciba como parámetro Fecha de Entrada, Fecha de Salida. Consultar la disponibilidad de todas las habitaciones en el rango de fechas solicitado.
Presentar: IdHabitación - Tipo de Habitación, Estado.
Ejemplo:
Entrada
Fecha de Entrada: 2019-03-14
Fecha de Salida:  2019-03-20
Ejecución
IdHabitación Tipo de Habitación         Estado
  1            Deluxe                 Disponible
  2            Deluxe                 Disponible
  3            Turística              Reservado
  4            Presidencial           Disponible
  ..           .....                  .....
  ..           .....                  .....
Nota: Con que exista un día ocupado en la habitación en el rango solicitado, el estado será: Reservado.

Es bastante parecido a la consulta de mi post anterior, así que, decidí modificarla y en teoría funciona, pero por ejemplo, tengo 5 datos almacenados y este muestra 30 datos en la ejecución.

Adjunto mi código:

Código (sql) [Seleccionar]

CREATE PROCEDURE SP_Disponibilidad2
@fecha_entrada DATE,
@fecha_salida  DATE
AS BEGIN
DECLARE @ocupado INTEGER
DECLARE @tmp_table TABLE (
HabitacionID INT,
TipoHab varchar(80),
Estado VARCHAR(10)
)
   
WHILE ( @fecha_entrada <= @fecha_salida )
BEGIN
SET @ocupado = (
SELECT COUNT(*)
FROM habitacion_reserva hr
--INNER JOIN habitacion h ON hr.id_habitacion = h.no_habitacion
--INNER JOIN tipo_habitacion th ON th.cod_tipo = h.cod_tipo
WHERE @fecha_entrada BETWEEN fecha_entrada AND fecha_salida
)
IF ( @ocupado > 0 )
INSERT INTO @tmp_table
SELECT
h.no_habitacion,
th.nom_tipo,
'Reservado'
FROM habitacion_reserva hr
INNER JOIN habitacion h ON hr.id_habitacion = h.no_habitacion
INNER JOIN tipo_habitacion th ON th.cod_tipo = h.cod_tipo
--WHERE @fecha_entrada BETWEEN fecha_entrada AND fecha_salida
ELSE
INSERT INTO @tmp_table
SELECT
hr.id_habitacion,
th.nom_tipo,
'Disponible'
FROM habitacion_reserva hr
INNER JOIN habitacion h ON hr.id_habitacion = h.no_habitacion
INNER JOIN tipo_habitacion th ON th.cod_tipo = h.cod_tipo
--WHERE @fecha_entrada BETWEEN fecha_entrada AND fecha_salida
   
SET @fecha_entrada = DATEADD( DAY, 1, @fecha_entrada )
END
   
SELECT * FROM @tmp_table
END
   
   /********************************/


EXECUTE SP_Disponibilidad2 '2019-07-20', '2019-07-25'


+--------------+------------+
| IdHabitacion| Estado      |
+--------------+------------+
| 1                | Reservado |
| 2                | Reservado |
| 3                | Reservado |
| 4               | Disponible |
| 5                | Disponible |
| 1               | Disponible |
| ...30           | Disponible |
+------------+--------------+
#8
¡Muchas gracias! Es justamente lo que necesitaba.
#9
Bien, tengo la siguiente base de datos:

Código (sql) [Seleccionar]

CREATE DATABASE Hotel
GO
use Hotel;
GO

create table tipo_habitacion(
cod_tipo integer primary key,
nom_tipo varchar(25) not null,
precio money not null
);

create table habitacion(
no_habitacion integer primary key,
cod_tipo integer foreign key references tipo_habitacion(cod_tipo),
descr varchar(60),
cap integer not null,
stat varchar(15)
);

create table cliente(
id_cliente integer primary key identity(0,1),
p_nom varchar(15),
s_nom varchar(15),
p_apell varchar(15),
s_apell varchar(15),
direccion varchar(70),
tel varchar(10),
correo varchar(25)
);

create table empleado(
id_empleado integer primary key identity(0,1),
p_nom varchar(15),
s_nom varchar(15),
p_apell varchar(15),
s_apell varchar(15),
direccion varchar(70),
tel varchar(10),
correo varchar(25)
);

create table reserva(
id_reserva integer primary key identity(0,1),
id_cliente integer foreign key references cliente(id_cliente),
id_empleado integer foreign key references empleado(id_empleado),
fecha_reserva date not null,
forma_pago varchar(15),
divisa varchar(3),
stat varchar(15)
);

create table habitacion_reserva(
id_hab_reserva integer primary key identity(0,1),
id_habitacion integer foreign key references habitacion(no_habitacion),
id_reserva integer foreign key references reserva(id_reserva),
fecha_entrada date not null,
fecha_salida date not null,
        precio money
);

create table huesped(
id_huesped integer primary key identity(0,1),
p_nom varchar(15),
s_nom varchar(15),
p_apell varchar(15),
s_apell varchar(15),
direccion varchar(70),
tel varchar(10),
nacionalidad varchar(25),
correo varchar(25)
);

create table huesped_hab_reserva(
id_huesped int foreign key references huesped(id_huesped) not null,
id_hab_reserva int foreign key references habitacion_reserva        (id_hab_reserva) not null
);

alter table huesped_hab_reserva
add primary key(id_huesped, id_hab_reserva);

create table servicio(
id_servicio integer primary key identity(0,1),
descr varchar(60),
precio money
);

create table cargos_servicios(
id_servicio int foreign key references servicio        (id_servicio) not null,
id_hab_reserva int foreign key references habitacion_reserva       (id_hab_reserva) not null, precio money
);
alter table cargos_servicios
add primary key(id_servicio, id_hab_reserva);


El problema es el siguiente:

Realizar un procedimiento almacenado que reciba como parámetro: ID Habitación, Fecha de Entrada, Fecha de Salida.
Consultar la disponibilidad de la habitación en cuanto a las fechas solicitadas mediante un estado.
Ejemplo:
Entrada
IdHabitación: 2
Fecha de Entrada: 2019-03-14
Fecha de Salida:  2019-03-20
Ejecución
Fecha          Estado
2019-03-14     Disponible
2019-03-15     Disponible
2019-03-16     Disponible
2019-03-17     Disponible
2019-03-18     Disponible
2019-03-19     Disponible
2019-03-20     Salida

En caso que exista una reserva en los días solicitados el estado será: "Reservado". El estado del último día debe ser: "Salida" y no ocupa implica una reserva.

Llevo atascado en eso desde hace varios días, y lo último que pude hacer fue esto:

Código (sql) [Seleccionar]

CREATE PROCEDURE Disponibilidad @FechaEntrada date,
@FechaSalida date,
@IdHabitación int
AS
SELECT
hr.fecha_entrada,
r.stat AS Estado
FROM habitacion_reserva hr
INNER JOIN reserva r ON r.id_reserva = hr.id_reserva
INNER JOIN habitacion h ON h.no_habitacion = hr.id_habitacion
WHERE r.fecha_reserva NOT BETWEEN @FechaEntrada AND @FechaSalida
AND hr.id_habitacion = @IdHabitación

EXEC Disponibilidad '2019-04-01', '2019-04-10', 2



Y obviamente está incorrecto, así que, espero que sean de gran ayuda ya que la resolución de ese problema es de 'vida o muerte'
#10
Al encontrar el nombre que estoy buscando, además de enviarme el mensaje de que ha sido encontrado, también muestra en pantalla el mensaje de que no ha sido encontrado. Esto sucede cuando el programa busca posición por posición, o sea, si el nombre está en la posición 2, primero muestra el mensaje de que no ha sido encontrado, luego que sí y en el resto de posiciones que no. Sólo quiero que el programa muestre los mensajes una vez.

Código (java) [Seleccionar]


package ejemplostring;
import java.util.Scanner;
import javax.swing.JOptionPane;

public class EjemploString {

    public static void main(String[] args) {
        // TODO code application logic here
        Scanner in = new Scanner(System.in);
        String[] ID = new String[5];
        String x;
        for(int i=0;i<ID.length;i++){
            System.out.print("Ingrese un nombre #"+i+": ");
            ID[i] = in.next();
        }
        for(int i=0;i<ID.length;i++){
            System.out.println("Nombres: "+ID[i]);
        }
        x = JOptionPane.showInputDialog("Ingrese el nombre que busca");
        for(int i=0;i<ID.length;i++){
            if(x.equals(ID[i])){
                JOptionPane.showMessageDialog(null, "Nombre: "+ID[i]);
            }else{
                JOptionPane.showMessageDialog(null, "No encontrado");
            }
        }
    }
   
}