SqlServer 2017 for ubuntu 16.04 lts

Me ha sorprendido de que Microsoft ahora tiene soporte sqlserver para gnu/linux y verificando veo que es compatible y estos son los pasos que segui para instarlo, el puerto por defecto es 1433.

en mi caso todo lo hice con su (root usuario).

curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add –
add-apt-repository “$(curl https://packages.microsoft.com/config/ubuntu/16.04/mssql-server-2017.list)”
add-apt-repository “$(curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list)”
apt update
apt install -y mssql-server

# en esta paso elegi la licencia de developer
# aqui pide la contrasena de la base de datos.
/opt/mssql/bin/mssql-conf setup

systemctl status mssql-server

apt install -y mssql-tools unixodbc-dev

#esto lo hice con el usuario normal:
echo ‘export PATH=”$PATH:/opt/mssql-tools/bin”‘ >> ~/.bash_profile
echo ‘export PATH=”$PATH:/opt/mssql-tools/bin”‘ >> ~/.bashrc
source ~/.bashrc

sqlcmd -S localhost -U SA -P ‘tu pass’

# se creara la base de datos de ejemplo, no te precupes si no sale ningun mensaje, ya que saldra hasta que teclemos GO.
CREATE DATABASE TestDB
SELECT Name from sys.Databases
GO

USE TestDB
CREATE TABLE Inventory (id INT, name NVARCHAR(50), quantity INT)
INSERT INTO Inventory VALUES (1, ‘banana’, 150); INSERT INTO Inventory VALUES (2, ‘orange’, 154);
GO

SELECT * FROM Inventory WHERE quantity;
GO

QUIT

Hay que mencionar que esto se puede usar ya con java, php o conectarse atraves de sqlmanagerstudio, pero recuerda que tienes que abrir los puertos.

Lo otro es que cuando empeze a usarlo queria conectarme desde mi ubuntu entoces use https://dbeaver.jkiss.org/, ya que podriamos conectarnos a la base de datos.

Pero leyendo la noticia veo que ya hay un ide para gnu/linux llamado SQL Operations Studio (preview).

Si desea usar driver jdbc debes descargarlo de los repositorios que tiene Microsoft con Maven o bajarlos manualmente.

Captura en dbeaver sqlserver 2017:

source: https://docs.microsoft.com/es-es/sql/linux/quickstart-install-connect-ubuntu

codigo de arbol con clases.


#include <iostream>
using namespace std;

class NodoArbol
{
public:
int dato;
NodoArbol *izquierdo;
NodoArbol *derecho;
};

class Arbol{

public:

Arbol()
{
inicializarArbol();
}

void mostarorden()
{
InOrden(raiz);
}
//al nodo enviado en hijo agregarle como hijo el valor enviado en valorNodo
void agregarNodoHijo(NodoArbol *hijo, int valorNodo)
{
//si tiene que ir en el hijo izquierdo
if(hijo->dato > valorNodo)
{
if(hijo->izquierdo==NULL)
{

hijo->izquierdo= new NodoArbol;
hijo->izquierdo->dato=valorNodo;
hijo->izquierdo->izquierdo=NULL;
hijo->izquierdo->derecho=NULL;
}
else
{
agregarNodoHijo(hijo->izquierdo, valorNodo);
}
}

//si tiene que ir en el hijo derecho
if (hijo->dato <=valorNodo)
{
if(hijo->derecho==NULL)
{
hijo->derecho = new NodoArbol;
hijo->derecho->dato=valorNodo;
hijo->derecho->izquierdo=NULL;
hijo->derecho->derecho=NULL;
}

else
{

agregarNodoHijo(hijo->derecho, valorNodo);
}
}


}


void agregarNodo(int valorNodo)
{

if (raiz==NULL)
{
raiz = new NodoArbol;
raiz->dato=valorNodo;
raiz->izquierdo=NULL;
raiz->derecho=NULL;
}

else
{
agregarNodoHijo(raiz,valorNodo);
}

}

//Lectura de Arbol
private:
NodoArbol *raiz;
NodoArbol *auxiliar;
void inicializarArbol();

void InOrden(NodoArbol *hijo);

};
void Arbol::inicializarArbol()
{
raiz=NULL;
auxiliar=NULL;

}

void Arbol::InOrden(NodoArbol *hijo)
{
if (hijo!=NULL)
{
InOrden(hijo->izquierdo);
cout << hijo->dato << "\n";
InOrden(hijo->derecho);

}

}
int main()
{
Arbol *miarbol = new Arbol();

int datoLeido=0;

cout << "Ingrese un numero (0 para salir)\n";
cin >> datoLeido;

while(datoLeido != 0)
{
miarbol->agregarNodo(datoLeido);
cin >> datoLeido;
}
cout << "\n in orden:\n";
miarbol->mostarorden();
delete miarbol;
cin.get();cin.get();
return 0;
}

Open Data Kit ODK

Buscando una alternativa fácil de usar para poder colectar datos para encuestas o recolección de información en forma digital, hemos visto que ODK cumple con estos requisitos, ya que es fácil de usar y simple.

La pagina es esta:

Home

Entre sus bondades hemos encontrado:

– Que el servidor puede funcionar en Plataforma de Google.
– Servidor puede usarse de forma local para poder hacer recolecciones en lugares remotos donde no existe coneccion en internet.
– Tiene varios herramientas donde podemos generar el formulario o nuestras encuestas.

En fin podemos concluir que si deseamos una alternativa a Commcare o Iformbuilder, ODK es una buena alterntiva, ya que su simpleza hace que cualquier persona puede usarlo.

un vídeo interesante para que pueden ver.

Creación de Roles, permiso, crear usario en Oracle 11g

Este script crea un usuario y este puede crear otros usuario para que puede usar las tablas según el rol que se les haya dado.

--   Autor: Mynor Choc
--   Carne: 1890-09-3697
--   DBMS: Oracle 11g
--   Tema: Roles.

--creamos un table space.
CREATE BIGFILE TABLESPACE table_tarea DATAFILE 'table_tarea.dat' SIZE 100M AUTOEXTEND ON;

--creamos un usuario, desbloquemos el usuario y damos permiso de coneccion 
CREATE USER usuario_tarea  PROFILE DEFAULT IDENTIFIED BY usuario_tarea DEFAULT TABLESPACE table_tarea ACCOUNT UNLOCK;
GRANT CONNECT TO usuario_tarea;

-- permiso para crear tablas, rol, usuario y conneccion
GRANT CREATE TABLE TO usuario_tarea;
GRANT CREATE ROLE TO usuario_tarea;
GRANT CREATE USER TO usuario_tarea;
GRANT UNLIMITED TABLESPACE  TO usuario_tarea;
GRANT CREATE TO usuario_tarea with admin option;

-- habilitamos que el usuario que tenga un permiso ilimitado a la tablesspace.
ALTER USER usuario_tarea quota unlimited on table_tarea;

--conectamos a usuario_tarea
CONNECT usuario_tarea/usuario_tarea

-- creamos las tablas, llaves primarias, relaciones y los constraints

CREATE TABLE clientes
  (
    id     INTEGER NOT NULL ,
    nombre VARCHAR2 (100) NOT NULL ,
    nit    VARCHAR2 (50) NOT NULL
  ) ;
ALTER TABLE clientes ADD CONSTRAINT clientes_PK PRIMARY KEY ( id ) ;

CREATE TABLE compras
  (
    id              INTEGER NOT NULL ,
    nombre_producto VARCHAR2(100) NOT NULL ,
    inventario_id   INTEGER NOT NULL
  ) ;
ALTER TABLE compras ADD CONSTRAINT compras_PK PRIMARY KEY ( id ) ;

CREATE TABLE inventario
  (
    id                INTEGER NOT NULL ,
    nombre_inventario VARCHAR2 (100) NOT NULL
  ) ;
ALTER TABLE inventario ADD CONSTRAINT inventario_PK PRIMARY KEY ( id ) ;

CREATE TABLE productos
  (
    id             INTEGER NOT NULL ,
    nombre         VARCHAR2 (100) NOT NULL ,
    descripcion    VARCHAR2 (100) ,
    proveedores_id INTEGER NOT NULL ,
    inventario_id  INTEGER NOT NULL ,
    ventas_id      INTEGER NOT NULL
  ) ;
ALTER TABLE productos ADD CONSTRAINT productos_PK PRIMARY KEY ( id ) ;

CREATE TABLE proveedores
  (
    id     INTEGER NOT NULL ,
    nombre VARCHAR2 (100) NOT NULL
  ) ;
ALTER TABLE proveedores ADD CONSTRAINT proveedores_PK PRIMARY KEY ( id ) ;

CREATE TABLE ventas
  (
    id          INTEGER NOT NULL ,
    cantidad    VARCHAR2 (100) NOT NULL ,
    clientes_id INTEGER NOT NULL
  ) ;
ALTER TABLE ventas ADD CONSTRAINT ventas_PK PRIMARY KEY ( id ) ;

ALTER TABLE compras ADD CONSTRAINT compras_inventario_FK FOREIGN KEY ( inventario_id ) REFERENCES inventario ( id ) ;

ALTER TABLE productos ADD CONSTRAINT productos_inventario_FK FOREIGN KEY ( inventario_id ) REFERENCES inventario ( id ) ;

ALTER TABLE productos ADD CONSTRAINT productos_proveedores_FK FOREIGN KEY ( proveedores_id ) REFERENCES proveedores ( id ) ;

ALTER TABLE productos ADD CONSTRAINT productos_ventas_FK FOREIGN KEY ( ventas_id ) REFERENCES ventas ( id ) ;

ALTER TABLE ventas ADD CONSTRAINT ventas_clientes_FK FOREIGN KEY ( clientes_id ) REFERENCES clientes ( id ) ;

INSERT INTO USUARIO_TAREA.CLIENTES (ID, NOMBRE, NIT) VALUES ('1', 'Juan gomez', '455555-nk');
INSERT INTO USUARIO_TAREA.VENTAS (ID, CANTIDAD, CLIENTES_ID) VALUES ('1', '4', '1');
INSERT INTO USUARIO_TAREA.PROVEEDORES (ID, NOMBRE) VALUES ('1', 'coka-cola');
INSERT INTO USUARIO_TAREA.INVENTARIO (ID, NOMBRE_INVENTARIO) VALUES ('1', 'Finca el zapote');
INSERT INTO USUARIO_TAREA.PRODUCTOS (ID, NOMBRE, DESCRIPCION, PROVEEDORES_ID, INVENTARIO_ID, VENTAS_ID) VALUES ('1', 'Bebida coka', '12 onza', '1', '1', '1');
INSERT INTO USUARIO_TAREA.COMPRAS (ID, NOMBRE_PRODUCTO, INVENTARIO_ID) VALUES ('1', 'coka-cola', '1');

-- creamos los roles 
CREATE ROLE cajero;
CREATE ROLE supervisor;
CREATE ROLE enc_compras;
CREATE ROLE jefe_compras;

-- permiso para el cajero
GRANT SELECT ON productos TO cajero;
GRANT SELECT,INSERT ON ventas TO cajero;
GRANT UPDATE ON inventario TO cajero;
GRANT UPDATE,SELECT,DELETE ON clientes TO cajero;

-- permiso para el supervisor
GRANT SELECT ON productos TO supervisor;
GRANT DELETE,UPDATE,SELECT,INSERT ON ventas TO supervisor;
GRANT UPDATE,SELECT,DELETE ON clientes TO supervisor;

--Permiso para el enc_compras
GRANT SELECT ON proveedores TO enc_compras;
GRANT INSERT,DELETE,UPDATE,SELECT ON productos TO enc_compras;
GRANT SELECT,INSERT ON compras TO enc_compras;

--permiso para el jefe_compras
GRANT enc_compras TO jefe_compras;
GRANT DELETE,UPDATE ON compras TO jefe_compras;
GRANT INSERT,SELECT,DELETE,UPDATE ON proveedores TO jefe_compras;

--creamos los usuarios 4 usuarios.
--usuario_cajero;
--usuario_supervisor;
--usuario_enc_compras;
--usuario_jefe_compras
CREATE USER usuario_cajero  PROFILE DEFAULT IDENTIFIED BY usuario_cajero DEFAULT TABLESPACE table_tarea ACCOUNT UNLOCK;
GRANT CONNECT TO usuario_cajero;

CREATE USER usuario_supervisor  PROFILE DEFAULT IDENTIFIED BY usuario_supervisor DEFAULT TABLESPACE table_tarea ACCOUNT UNLOCK;
GRANT CONNECT TO usuario_supervisor;

CREATE USER usuario_enc_compras  PROFILE DEFAULT IDENTIFIED BY usuario_enc_compras DEFAULT TABLESPACE table_tarea ACCOUNT UNLOCK;
GRANT CONNECT TO usuario_enc_compras;

CREATE USER usuario_jefe_compras  PROFILE DEFAULT IDENTIFIED BY usuario_jefe_compras DEFAULT TABLESPACE table_tarea ACCOUNT UNLOCK;
GRANT CONNECT TO usuario_jefe_compras;

-- damos los permisos a cada usuario utilizaremos cada rol
-- ROLE cajero;
-- ROLE supervisor;
-- ROLE enc_compras;
-- ROLE jefe_compras;
GRANT cajero TO usuario_cajero;
GRANT supervisor TO usuario_supervisor;
GRANT enc_compras TO usuario_enc_compras;
GRANT jefe_compras TO usuario_jefe_compras;


-- esto puede ver que roles tiene un que nos conectemos
select * from user_role_privs;

-- nos conectamos a usuario.
-- Podemos hacer las pruebas para cada usuario y vermos que solo tenemos acceso
-- a las tablas por medio del rol.
CONNECT usuario_cajero/usuario_cajero;

select * from user_role_privs;
select * from usuario_tarea.compras; --Esta tabla no existe ya que no tenemos acceso a ella por el rol.
-- en esta caso probamos la tabla de producto, y esto solo tiene acceso sobre select ya que asi esta en el rol
select * from usuario_tarea.productos; -- el rol cajero puede selecionar esta tabla.
DELETE FROM usuario_tarea.productos WHERE id = 1; -- no tenemos privilegios para eliminar.
UPDATE usuario_tarea.productos  SET nombre = 'hola'   WHERE id = 1; -- no tenemos privilegios para actualizar
INSERT INTO usuario_tarea.PRODUCTOS(ID, NOMBRE , DESCRIPCION , PROVEEDORES_ID ,   VENTAS_ID ,   INVENTARIO_ID) VALUES  (1,'hola','otros',1,1,1); -- no tiene privilegios para insertar
--tabla ventas
INSERT INTO USUARIO_TAREA.VENTAS (ID, CANTIDAD, CLIENTES_ID) VALUES ('2', '5', '1'); -- esta tabla si puede insertar ya que es el unico que esta permitido en rol del cajero.
exit;

CONNECT usuario_supervisor/usuario_supervisor;
select * from user_role_privs;
exit;

CONNECT usuario_enc_compras/usuario_enc_compras;
select * from user_role_privs;
exit;

CONNECT usuario_jefe_compras/usuario_jefe_compras
select * from user_role_privs;
exit;

Procedure en oracle 11g con WHEN NO_DATA_FOUND exepciones

Ejercicio No.1

Crear un procedimiento con el nombre de Actualiza_Saldo, el cual deberá permitir actualizar el saldo de una cuenta, la tabla se llama: Saldos_Cuentas y contiene los siguientes campos: Saldo de tipo numérico, Fecha_Actualizacion tipo date y Co_Cuenta (número de cuenta) de tipo numérico. El procedimiento debe permitir enviar el número de cuenta y saldo como parámetros para su búsqueda y actualización, así mismo la fecha de actualización debe ser actualizada con la fecha del sistema.

CREATE TABLE Saldos_Cuentas
(
Saldo INTEGER ,
Fecha_Actualizacion DATE ,
Co_Cuenta INTEGER NOT NULL
);
ALTER TABLE Saldos_Cuentas ADD CONSTRAINT Saldos_Cuentas_PK PRIMARY KEY ( Co_Cuenta ) ;


Insert into SALDOS_CUENTAS (SALDO,FECHA_ACTUALIZACION,CO_CUENTA) values (333,to_date('11/08/15','DD/MM/RR'),3);
Insert into SALDOS_CUENTAS (SALDO,FECHA_ACTUALIZACION,CO_CUENTA) values (33333,to_date('12/08/15','DD/MM/RR'),4);

CREATE OR REPLACE PROCEDURE Actualiza_Saldo(Cuentabuscar INTEGER,nuevosaldo INTEGER)
AS
BEGIN
UPDATE SALDOS_CUENTAS SET saldo= nuevosaldo, FECHA_ACTUALIZACION = SYSDATE
WHERE CO_CUENTA=Cuentabuscar;
END;

SELECT * FROM SALDOS_CUENTAS;

EXEC ACTUALIZA_SALDO(3,4443333)

SELECT * FROM SALDOS_CUENTAS;

Ejercicio No. 2

Crear un procedimiento con el nombre de Ver_departamento, el cual debe permitir enviar como parámetro el número de departamento a través de la variable numdepart de tipo numérico, se debe de declarar las variables v_dnombre tipo varchar2 de 14 posiciones y localidad tipo varchar2 de 14 posiciones. El procedimiento debe realizar una consulta en la tabla depart la cual contiene los siguientes campos: dnombre(nombre del departamento), loc(localidad) y depot_no(número de departamento), la consulta se ejecutara a través del numdepart que se envía como parámetro, en caso de encontrar el número de departamento deberá de mostrar a través de un DBMS_OUTPUT el número de departamento con el nombre del mismo y su localidad, si no encontrase el departamento se debe de levantar la exception WHEN NO_DATA_FOUND, mostrando por medio de un DBMS_OUTPUT que no encontró el departamento.

CREATE TABLE depart
(
dnombre varchar2(14) ,
loc varchar2(14) ,
depot_no INTEGER NOT NULL
);
ALTER TABLE depart ADD CONSTRAINT depart_PK PRIMARY KEY ( depot_no );

create or replace PROCEDURE Ver_departamento(numdepart INTEGER)
is
v_dnombre varchar2(14);
localidad varchar2(14);
BEGIN
SELECT dnombre into v_dnombre
FROM depart
WHERE depot_no = numdepart;
DBMS_OUTPUT.PUT_LINE('Numero de departamento: '|| numdepart);
DBMS_OUTPUT.PUT_LINE('Nombre: ' || v_dnombre);
DBMS_OUTPUT.PUT_LINE('localidad: ' || localidad);
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('No se encontro ningun departamento');
WHEN others THEN
dbms_output.put_line('Ha ourrido un error!');
END;
exec Ver_departamento(2)

Consultas tabla empleado y departamentos

1. Obtener todos los datos de los empleados cuyos apellidos sean López o Pérez.

SELECT *
FROM empleados
WHERE apellidos = lower('lopez') OR apellidos = lower('perez')

2. Obtener Todos los datos de los Empleados cuyos apellidos empiecen con P.

SELECT *
FROM empleados
WHERE apellidos like lower('P%')

3. Obtener número de Empleados de cada departamento.

SELECT depa.nombre AS "Departamento", COUNT(emple.dni) AS "Total de empleados"
FROM empleados emple INNER JOIN departamentos depa
ON (emple.departamento = depa.codigo)
GROUP BY depa.nombre;

4. Obtener los Nombres y Apellidos de los empleados que trabajen en departamentos cuyo presupuesto sea mayor a Q. 60,000.00

SELECT emple.nombre ||' '|| emple.apellidos AS "nombre del empleado"
FROM empleados emple
WHERE departamento
IN(SELECT codigo FROM departamentos WHERE presupuesto &gt; 60000)

5. Obtener los Nombres de los departamentos que tienen más de 2 empleados.

SELECT depa.nombre AS "Departamento"
FROM empleados emple INNER JOIN departamentos depa
ON (emple.departamento = depa.codigo)
GROUP BY depa.nombre
having COUNT(emple.dni)&gt;2;

6. Despedir a todos los empleados que trabajen en el departamento de informática el cual el código es 14.

DELETE
FROM empleados
WHERE departamento = 14

base de datos:

--Autor: mchoccac
--en:2015-07-28
--DBMS:Oracle Database 11g

CREATE TABLE departamentos
(
codigo INTEGER NOT NULL ,
nombre NVARCHAR2 (100) ,
presupuesto INTEGER
);
ALTER TABLE departamentos ADD CONSTRAINT departamentos_PK PRIMARY KEY ( codigo ) ;

CREATE TABLE empleados
(
dni VARCHAR2 (8) NOT NULL ,
nombre NVARCHAR2 (100) ,
apellidos NVARCHAR2 (255) ,
departamento INTEGER NOT NULL
);
ALTER TABLE empleados ADD CONSTRAINT empleados_PK PRIMARY KEY ( dni ) ;
ALTER TABLE empleados ADD CONSTRAINT empleados_departamentos_FK FOREIGN KEY ( departamento ) REFERENCES departamentos ( codigo ) ;

Insert into DEPARTAMENTOS (CODIGO,NOMBRE,PRESUPUESTO) values (14,'informatica',50000);
Insert into DEPARTAMENTOS (CODIGO,NOMBRE,PRESUPUESTO) values (23,'tecnologia',200000);
Insert into DEPARTAMENTOS (CODIGO,NOMBRE,PRESUPUESTO) values (34,'talento',333333333);

Insert into EMPLEADOS (DNI,NOMBRE,APELLIDOS,DEPARTAMENTO) values ('222','maria','lopez',34);
Insert into EMPLEADOS (DNI,NOMBRE,APELLIDOS,DEPARTAMENTO) values ('363d','angel','mendez',34);
Insert into EMPLEADOS (DNI,NOMBRE,APELLIDOS,DEPARTAMENTO) values ('123','mynor','choc',14);
Insert into EMPLEADOS (DNI,NOMBRE,APELLIDOS,DEPARTAMENTO) values ('334','victor','choc',14);
Insert into EMPLEADOS (DNI,NOMBRE,APELLIDOS,DEPARTAMENTO) values ('e233','ana','ana',23);
Insert into EMPLEADOS (DNI,NOMBRE,APELLIDOS,DEPARTAMENTO) values ('233','juan','perez',23);
Insert into EMPLEADOS (DNI,NOMBRE,APELLIDOS,DEPARTAMENTO) values ('22','armando','lopez',14);

tabla de empleado y departamento

Compile and Create Postgres driver for Qt5 on Android android_armv5, android_armv7 and android_x86.

Compilacion y creacion Postgres driver para Qt5 para android:  android_armv5, android_armv7 y android_x86.

Compile and Create Postgres driver for Qt5 on Android android_armv5, android_armv7 and android_x86.

Comparto este script en “sh” para que se le sea fácil crear el driver android qt, cualquier sugerencia favor de comentar.

Share this script in “sh” that will be easy to create the android qt driver, any suggestions for comment.

Adjunto el script y readme en inglés y español.
Attached the script and readme in English and Spanish.
link v1: driverPostgresQtAndroid 32 bits obsoleto and obsolete

Soporte para 32 y 64 bits.
link v2: driverPostresQtAndroid

Test drivers: TestDriversPruebaDrivers

pass: http://mynorrene.choccac.com
Create by Choc Cac, R Mynor.

Compile and Create MySQL driver for Qt5 on Android android_armv5, android_armv7 and android_x86.

Compilacion y creacion MySQL driver para Qt5 para android:  android_armv5, android_armv7 y android_x86.

Compile and Create MySQL driver for Qt5 on Android android_armv5, android_armv7 and android_x86.

Comparto este script en “sh” para que se le sea fácil crear el driver android qt, cualquier sugerencia favor de comentar.

Share this script in “sh” that will be easy to create the android qt driver, any suggestions for comment.

Adjunto el script y readme en inglés y español.

Attached the script and readme in English and Spanish.

 link 1: driverMysqlQtAndroid 32 bits. obsoleto and obsolete
Soporte para plaforma de 32 o 64 bits.
pass: http://mynorrene.choccac.com
Create by Choc Cac, R Mynor.

Lectura serial de una entrada digital Ejercicio 1

 

/*
Una empresa de gaseosas tiene un sistema con dos
sensores, uno de ellos indica si la botella se ha llenado
con el líquido y el otro sensor indica si la botella
ya tiene la tapa. Para este caso simularemos los dos
sensores por medio de dos pulsadores (S1 y S2).

La rutina se describe de esta manera: si la botella se
llena de manera adecuada (se debe activar S1 y
mostrar por consola "Gaseosa llena" luego de ello
si tiene la tapa colocada (se debe activar S2 y mostrar por consola
"Gaseosa tapada"), al finalizar el proceso se debe encender un LED
que indica que el proceso terminó bien y además se debe mostrar
un mensaje por la consola "Gaseosa bien empacada". Recuerda
que primero se debe activar S1 y luego S2 para que le proceso sea válido.
*/

int pulsador2=2;
int pulsador3=3;
int led4=4;
boolean estado_1 = false;
boolean estado_2 = false;

void setup()
{
    pinMode(pulsador2, INPUT);  
    pinMode(pulsador3, INPUT);
    pinMode(led4,OUTPUT);
    Serial.begin(9600);
}

void loop()
{
    if (digitalRead(pulsador2)==LOW)
    {
        estado_1 = true;    
    }
    
    while(estado_1 == true)
    {
        Serial.println("=>Gaseosa llena");
        delay(1);   
        if(digitalRead(pulsador3)==LOW)
        {
                estado_2 = true;
                Serial.println("..Gaseosa tapada");
        }
        
        if(estado_2 == true)
        {
                estado_1 = false;
                estado_2 = false;
                Serial.println("##Gaseosa bien empacada");
                digitalWrite(led4,HIGH);
                delay(3000);
        }
    }
    digitalWrite(led4,LOW);
}