21/2/18

Variables en SqlServer

En ocasiones es cómodo almacenar en una variable un valor si se van a hacer varias consultas. Siempre se puede repetir la consulta original pero a veces no tiene sentido.

Para hacer esto en SqlServer...

declare @idDeTrabajo int;
select @idDeTrabajo = (select id from nuestraTabla where claveAlternativa like 'ED820');--sin paréntesis falla

select * from Telefono where idTrabajo = @idDeTrabajo;
select * from DireccionPostal where idTrabajo = @idTrabajo;

Subtabla separada por comas.

Si queremos facilitar la visualización desde sqlpuro de una relación de uno a muchos, en ocasiones, es conveniente mostrar los datos de esa "subtabla" en un campo. Físicamente se almacena en una tabla separada pero, para visualizar la visualización, la mostramos como un campo.
Explico el ejemplo:
  • Tenemos una relación de muchos a muchos (Productos, Categorias)
  • La pasamos a una relación de uno (Productos) a muchos (Categorías unida con ProductosCategorias)
  • Mostramos la lista de productos con un campo que se extrae de la tabla de la parte muchos.
Con SqlServer se podría hacer como muestra el ejemplo:
SELECT Productos.Nombre, 
 STUFF(
    (SELECT ', '  + Categorias.Categoria
    FROM Categorias
    INNER JOIN ProductosCategorias ON ProductosCategorias.idCategoria = Categorias.idCategoria
    WHERE ProductosCategorias.idProducto = Productos.idProducto
    FOR XML PATH('')),
    1, 2, '') As Categorias
FROM Productos

1/2/18

Powershell. Problema al instalar paquetes npm que incluyen "@" arroba.

npm install @types/chai --save-dev

El comando powershell superior da un error "Símbolo (token) no reconocido en el texto de origen."

El problema está en la "@". En powershell el símbolo @ se usa para definir cosas que siguen como arrays, literales de más de una línea, etc. por lo que no funciona tal y como funcionaría en cmd.exe o shells de linux

Para solucionarlo en Powershell, hemos de poner entre comillas el paquete que incluya la @

npm install "@types/chai" --save-dev

9/1/18

Powershell. Que no trunque las propiedades al mostrarlas.

En ocasiones cuando mostramos algo en powershell, si la propiedad es muy grande la trunca y muestra "..." al final de la misma y perdemos esa parte del dato. Para evitar esto, por ejemplo con rutas largas podemos hacer lo siguiente.
Buscar todos los directorios y ficheros que contengan "Test" y guarda la ruta completa.
dir -Recurse *Test* | select fullname  |Out-File -width 230 .\borrame.test.txt
Los pasos son:

  1. Buscar Test
  2. Selecciona el nombre completo
  3. Lo pasa a un fichero "borrame.test.txt" con una anchura de 230 caracteres (donde en principio suponemos que entrará la cadena)
Si no ponemos el -width 230 se truncaría en el ancho por defecto.

Me edito a mi mismo. Hay una solución mejor.

Si en lugar de "select fullname" escribirmos "% fullname", pasa a la línea siguiente sin problemas. tendríamos:
dir -recurse *.* | % fullname
Nos mostrará todos los ficheros, con la ruta completa y uno por línea, si se pasa de una línea lo pone en 2.
Además si al final ponemos " | clip ". Nos lo copiará al portapapeles.
dir -recurse *.* | % fullname | clip

27/11/17

Scrapping con C#. Listas de Contratación Temporal de la Xunta.

url es la variable con la url a scrapear //valga el palabro

"//td[@align='left']" es una expresión xpath que devolvería los TD con alineación izquierda

Para hacer el scrapping con cSharp usamos ScrapySharp

Hay ejemplo completo en GitHub aquí

Código:

ScrapingBrowser Browser = new ScrapingBrowser();
Browser.UserAgent = new FakeUserAgent("primero", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0");
Browser.AllowAutoRedirect = true; // Browser has settings you can access in setup
Browser.AllowMetaRedirect = true;
WebPage PageResult = await Browser.NavigateToPageAsync(new Uri(url));
IEnumerable TDs = PageResult.Html.SelectNodes("//td[@align='left']");
this.lNombre.Clear();
foreach (HtmlNode item in TDs) {
    this.lContenidosTDs.Add(item.InnerText);
}

22/11/17

Comprobación de Consulta das Listas de Vinculación Temporal Decreto 37/2006. Javascrip

Está también en Github

const fileName = "./personas.json";
const Horseman = require("node-horseman");
const cheerio = require('cheerio')
const fs = require('fs');

var horseman = new Horseman();

var Personas = [];
var PersonasAnteriores;
var grabarFichero = false;

function GestionDeParametros(params){
if(params.length == 3){// así es que se envía un parámetro
grabarFichero = true;
}
}
function getPersonas(body) {
var $ = cheerio.load(body);
//$(".taboadatos TD");
var columna = 0;
$('.taboadatos TD').each(function () {
columna++;
if (columna === 1) {
Personas.push($(this).text());
}
if (columna === 4) {
columna = 0;
}

});
if(grabarFichero){
fs.writeFileSync(fileName,JSON.stringify(Personas),'utf-8');
}
var i = 0;
console.log("LISTA DE CAMBIOS DE LAS LISTAS DEL B SEGÚN FICHERO: " + fileName);
console.log("===================================================");
Personas.forEach(element => {
if (element === PersonasAnteriores[i]) {
console.log("" + (i + 1) + ": (IGUALES) " + element);
} else {
console.log("" + (i + 1) + ": (DIFERENTES) " + element + '///' + PersonasAnteriores[i]);
}
i++;
});
}

function ShowPersonas(per) {
console.log(per);
}

function CargarPersonasAnteriores() {
try {
PersonasAnteriores = JSON.parse(fs.readFileSync(fileName, 'utf-8'));
} catch (err) {
console.error(err);
console.error("No existe el fichero generelo con: ***");
}
}

GestionDeParametros(process.argv);
CargarPersonasAnteriores();

horseman
.userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0")
.open('http://www.xunta.es/rcp/listas/rcp_li05/li05_lista_ambito_sel.jsp?rcpCOD_LISTA=76&rcpCOD_AMBITO=U0000&rcpDES_AMBITO=AMBITO%20AUTON%D3MICO&lang=gl')
.waitForSelector("TD")
.html()
.then(function (body) {
getPersonas(body)
horseman.close();
})
;

20/11/17

Test. Clase de ayuda para envío de pulsaciones de teclas.

SSk: Static Send Keys.

Es un envoltorio para facilitar el uso de la función "SendKeys.SendWait(string keys)" y algunas utilidades más como introducir un tiempo de espera entre pulsación y pulsación. También permite generar apropósito tiempo de espera (Tread.Sleep(miliseconds)) y facilita el envío de algunas teclas especiales.

Se encuentra en github como parte del proyecto Utils pero es, de momento, muy independiente y no necesita nada del resto del proyecto.

https://github.com/IvanCruzFraguela/UtilNs/blob/master/Test/SSk.cs

28/9/17

SqlServer. Asociar usuarios de Directorio Activo a Base de Datos.

Hay que estar en la Base de Datos:

use DatabaseName;
Luego hay que crear el usuario para la base de datos:
create user [dominio\usuarioOGrupo];

Se me hace extraña la notación entre corchetes pero es así. Hay que poner el corchete, dominio, barra invertida, usuario o grupo AD y corchete.

Una vez que el usuario ya lo tiene en cuenta SqlServer, hay que decirle para qué lo vamos a usar. Se pueden dar todo tipo de permisos por tabla y/o columna pero lo típico será asignarlo a uno de los roles que tenga la Base de datos.

alter role [db_datareader,db_datawriter,...] add member [dominio\usuarioOGrupo];

En este caso los primeros corchetes no se ponen, son para definir que hay que elegir alguno de los roles. Por ejemplo:

alter role db_datawriter add member [empresa\vendedores];

Esto daría permiso de escritura en la Base de Datos activa a los pertenecientes al grupo vendedores en nuestro dominio (empresa)

Con esto, los pertenecientes a un grupo de Directorio Activo podrán, por ejemplo, escribir en una base de datos. Una vez que a ese usuario de dominio se le quita del grupo, ya no podrá hacerlo.

21/9/17

Operaciones con campos Identity (SqlServer)

Muchas de las tablas que uso tienen campos autonuméricos, llamados Identity, en SqlServer.

Si necesitamos introducir un número específico en esos campos, por ejemplo, porque estemos copiando una tabla de otra base de datos, o queramos tener unos valores específicos en algunos registros, tenemos que parar esa inserción antes de hacerlo.
Para ello usamos el comando:
set identity_insert [tabla] off;
set identity_insert [tabla] on; // Para dejarlo como estaba
Es importante tener en cuenta que SqlServer solo permite parar una inserción a la vez por Base de Datos. No podríamos tener dos tablas con la inserción parada. Habría que parar una, hacer las operaciones correspondientes, dejarla con la inserción activa de nuevo, y entonces parar la siguiente.
Tras esto, para fijar el valor en el que queramos que siga la inserción (normalmente igual al mayor número insertado hasta ahora) habría que ejecutar el comando:
DBCC CHECKIDENT ('[tabla]', RESEED,[numeroapartirdelcualsumar1]);

20/6/17

SqlServer. Lista de tablas y tablas relacionadas (Foreing key)

Lista de tablas
select * from sys.all_objects where type like 'U'

Tablas relacionadas con una dada.
SELECT   
   distinct OBJECT_NAME (f.referenced_object_id) AS referenced_object  
   FROM sys.foreign_keys AS f  
   WHERE f.parent_object_id = OBJECT_ID('[Nombre_tabla]');

15/5/17

Otro de envío de teclas.

Ejecuta un chrome y le envía las teclas para probar la página

Parece funcionar. Habría luego que comprobar que la página ha hecho lo que se le ha pedido



Process p = new Process();
p.StartInfo.FileName = @"C:\Program Files (x86)\Google\Chrome\Application\Chrome.exe";
p.StartInfo.Arguments = @"file:///C:/Users/usuario/Desktop/borrame.html";//html que se quiere probar
p.Start();
p.WaitForInputIdle();
Thread.Sleep(1000);
SendKeys.SendWait("{TAB}");
SendKeys.SendWait("hola a todos");
SendKeys.SendWait("{Tab}");
SendKeys.SendWait("{Enter}");
Thread.Sleep(1000);
p.CloseMainWindow();

Lectura de datos de usuario de directorio activo a un fichero.

Está también en github aquí
using System;

using System.DirectoryServices;
using System.DirectoryServices.ActiveDirectory;
using System.IO;

namespace udaExe {
    class Program {
        static void Main(string[] args) {
            string ldapEntry;
            string fileName;
            int cantUsuarios = 0;
            if (!GetParameters(args, out ldapEntry, out fileName)) {
                Console.Out.WriteLine("uso: udaExe ldap fichero");
                Console.Out.WriteLine("Ejemplo: udaExe \"LDAP://OU=Users,dc=microsoft,dc=local\" \"c:\\usuarios.txt\"");

            } else {
                Console.Out.WriteLine("Buscando usuarios:");

                using (StreamWriter sw = File.CreateText(fileName)) {
                    try {
                        DirectoryEntry directoryObject = new DirectoryEntry(ldapEntry);
                        foreach (DirectoryEntry child in directoryObject.Children) {
                            string displayName = GetProperty(child, "displayName");
                            string distinguishedName = GetProperty(child, "distinguishedName");
                            string samAccountName = GetProperty(child, "samAccountName");
                            child.Close();
                            child.Dispose();
                            sw.WriteLine($"{displayName}#{samAccountName}#{distinguishedName}");
                            cantUsuarios++;
                        }
                        directoryObject.Close();
                        directoryObject.Dispose();
                    } catch (DirectoryServicesCOMException ex) {
                        Console.Error.WriteLine("Error: " + ex.Message.ToString());
                    }
                }
                Console.Out.WriteLine(cantUsuarios.ToString() + " usuarios encontrados, fichero generado: " + fileName);
            }
        }

        public static string GetProperty(DirectoryEntry de, string PropertyName) {
            if (de.Properties.Contains(PropertyName)) {
                return de.Properties[PropertyName][0].ToString();
            } else {
                return string.Empty;
            }
        }

        public static bool GetParameters(string[] args, out string ldap, out string fileName) {
            ldap = String.Empty;
            fileName = @"c:\users.txt";
            if (args.Length < 1) {
                return false;
            }
            ldap = args[0];
            if (args.Length >= 2) {
                fileName = args[1];
            }
            return true;
        }
    }
}

30/3/17

Disposición típica en HTML con etiquetas semánticas.

Está sacado de:
https://www.w3.org/TR/css-flexbox-1/



<!DOCTYPE html>
<header>...</header>
<main>
   <article>...</article>
   <nav>...</nav>
   <aside>...</aside>
</main>
<footer>...</footer>

3/2/17

Ordenar tablas de una base de datos para que las referenciadas estén antes de las que referencian

public void OrdenaTablas() {
    List listaOrdenada = new List();
    while (this.lTable.Count > 0) {//mientras haya elementos
        ColocaTablaEnOrden(this.lTable, this.lTable[0], listaOrdenada);
    }
    foreach (var item in listaOrdenada) {
        lTable.Add(item);
    }
}
private void ColocaTablaEnOrden(List listaOriginal, CTableM cTableM, List listaOrdenada) {
    listaOriginal.Remove(cTableM);
    foreach (CRelationM relacion in cTableM.lRelation) {
        string NombreTablaConLaQueSeRelaciona = relacion.tableDestination;
        CTableM tablaRelacionada = listaOriginal.Find(x => x.Name.Equals(NombreTablaConLaQueSeRelaciona));
        if (tablaRelacionada != null) {//Si la tabla relacionada aún está en la lista de tablas a ordenar
            //Meter antes en la lista de ordenadas
            ColocaTablaEnOrden(listaOriginal, tablaRelacionada, listaOrdenada);
        }
    }
    listaOrdenada.Add(cTableM);
}

14/9/16

Crear servicio en Windows:

1 - Nuevo proyecto de tipo: Installed → Visual C# → Classic Desktop → Windows Service.
2 - Saca un editor en donde poner componentes pero lo más importante es poner la propiedad (F4) “ServiceName”. Esta propiedad será el nombre que tiene el servicio en Windows. No será el nombre del ejecutable.
3 - Añadir un “Instalador” se hace con “Add Instaler” en la parte baja de la pestaña de propiedades. No sé exáctamente para qué sirve, pero ahí podremos poner una descripción del servicio y algunas propiedades interesantes más, pero si no se añade esto, luego no se “Instala” el servicio.
4 - “Instalar el Servicio”. No se puede ejecutar directamente, hay que instalarlo y luego iniciarlo. Para instalarlo hay que ejecutar: InstallUtil con el nombre del fichero ejecutable.
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe .\PCSService.exe

5 - “Arrancar el Servicio”. Se hace con net start y el nombre del servicio que hemos puesto en el paso 2.
net start XviConSl

Nota final:
Si en las propiedades del Servicio hemos puesto "AutoLog" a true (que viene por defecto) podremos ver con el visor de eventos (ejecutar "eventvwr" en cmd) mensajes del servicio al instalarse, iniciar, parar tanto en la parte de "sistema" como en la de "aplicaciones".

 

24/8/16

Html y css. Esqueleto página centrada horizontalmente

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml">
 <head> 
  <style> 
   div.clBloqueEncabezado{ 
                  background-color: cyan; 
    text-align: center; 
   } 
   div.clEncabezado{
    display:inline-block;
    background-color:green; 
    padding:0.5em; 
   } 
   div.clCuerpo { 
    text-align: center; 
   } 
   div.clMenu { 
    display: inline-block; 
    background-color: lightblue; 
   } 
   div.clPanelPrincipal { 
    display: inline-block; 
    background-color: lightcoral; 
   } 
   div.clBloquePie { 
    background-color: aquamarine; 
    text-align: center; 
   } 
   div.clPie{ 
    display:inline-block; 
    background-color:green; 
    padding:0.5em; 
   } 
  </style> 
 </head> 
 <body> 
  <div class="clBloqueEncabezado"> 
   <div class="clEncabezado"> 
    Encabezado 
   </div>
  </div> 
  <div class="clCuerpo"> 
   <div class="clMenu"> 
    <h2>Menú</h2> 
    <ul> 
     <li>Uno</li> 
     <li>Dos</li> 
     <li>Tres</li> 
    </ul> 
   </div> 
   <div class="clPanelPrincipal">panelPrincipal</div> 
  </div> 
  <div class="clBloquePie">
   <div class="clPie">Pie</div> 
  </div> 
 </body> 
</html>

19/8/16

Buscar con grep

grep -l -r -i --include="*.cs" "tExto a buscar" .
(Ojo que hay un punto al final)
  • -l que muestre solo el nombre
  • -r que busque en los directorios recursivamente.
  • -i CaseInsensitive. Que no distinga mayúsculas de minúsculas.
  • --include="*.cs". Tipos de fichero a buscar.
  • El punto al final es "Donde" buscar. En este caso en el directorio actual.

    (Si no se pone da un error extraño)

    grep: (entrada estándar): Not enough space

Para windows se consigue aquí


29/6/16

Hola mundo con C# Interactive de Visual Studio 2015

> #r "System.Windows.Forms" //Cargar el ensamblado
> using System.Windows.Forms; //Usar el Namespace
> MessageBox.Show("Hola"); //Mostrar el mensaje

9/6/16

Incluir fichero css en código con JSF.

Definiendo en el código xhtml la etiqueta h con
xmlns:h="http://java.sun.com/jsf/html"

Escribimos:

<h:outputStylesheet library="css" name="Estilos.css"  />

En cualquier parte del código

Lo que genera incluye en la cabecera, y con la ruta adecuada, y ... con parámetros que no entiendo un enlace
<link type="text/css" rel="stylesheet"
href="/proyecto/javax.faces.resource/Estilos.css.xhtml?ln=css" />
Pero el caso es que funciona. Si se usa algún estilo en la página lo usa.
Ejemplo:
<p:panelGrid columns="2" columnClasses="alinearArriba">

20/4/16

Conectar Java con SqlServer.

  1. Abrir SqlServer para conexión por tcp/ip
  2. Para SqlServer 2008 sería:

    Ejecutar: Microsoft SQL Server 2008>Herramientas de configuración>Administración de Configuración de SQL Server

    Desplegar "Configuración de red de SQL Server", "Protocolos de " [Nombre instancia], y en TCP/IP dejar como habilitado

  3. Conseguir el jar adecuado.
  4. página de Microsoft sobre el tema

    Para la Java 1.7 corresponde el sqljdbc41.jar que habría que bajar de Internet

  5. La cadena de conexión
  6. Aquí está la madre del cordero.

    En mi caso "jdbc:sqlserver:" es siempre fijo.

    //nombre servidor:numero de puerto

    instanceName=nombre de instancia(si hay varias en el mismo equipo es fundamental ponerla)

    si se trabaja con autenticación de sqlServer (no Directorio Activo), user y password

    En resumen:

    "jdbc:sqlserver://localhost:1433;instanceName=SQLEXPRESS2008;databaseName=nombreBD;user=sa;password=secreta";

Con esto funciono.

Añado código de ejemplo:(Sacado de uno de los ejemplos de Microsoft que vienen junto al .jar para conectarse)


import java.sql.*;


public class CrudSqlServer1 {

 public static void main(String[] args) {
  // Create a variable for the connection string.
  String connectionUrl = "jdbc:sqlserver://localhost:1433;instanceName=SQLEXPRESS2008;databaseName=nombreBD;user=sa;password=secreta";

  // Declare the JDBC objects.
  Connection con = null;
  Statement stmt = null;
  ResultSet rs = null;
  
         try {
          // Establish the connection.
          Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
              con = DriverManager.getConnection(connectionUrl);
            
              // Create and execute an SQL statement that returns some data.
              String SQL = "SELECT * FROM Tabla1";
              stmt = con.createStatement();
              rs = stmt.executeQuery(SQL);
            
              // Iterate through the data in the result set and display it.
              while (rs.next()) {
               System.out.println(rs.getString(4) + " " + rs.getString(6));
              }
              System.out.println("FIN");
         }
        
  // Handle any errors that may have occurred.
  catch (Exception e) {
   e.printStackTrace();
  }

  finally {
   if (rs != null) try { rs.close(); } catch(Exception e) {}
       if (stmt != null) try { stmt.close(); } catch(Exception e) {}
       if (con != null) try { con.close(); } catch(Exception e) {}
  }

 }

}

19/3/16

Vim. Fijar los espacios de un tab. 8 es mucho.

Hay que poner las dos variables.
:set ts=4
:set sw=4
Siempre el mismo número. Es para el tab y el >>. que por lo visto, no son lo mismo.

Estructura base html a 19/03/2016

  1. Bajar jQuery
  2. 4 ficheros: Los "min" para producción (con el javascript comprimido) y los normales para depuración Para cada uno habría que considerar las versiones 1.X compatibles con Explorers 6,7 y 8 y los de la 2.X que no soportan esos navegadores Download jQuery
  3. Bajar bootstrap
  4. Baja todas las versiones (min y normal) Download Bootstrap
  5. Página vacía
  6. Copiado de: https://openwebinars.net/tutorial-bootstrap-3-introduccion-e-instalacion/ <!DOCTYPE html> <html lang="es"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!--Con esto garantizamos que se vea bien en dispositivos móviles--> <title>Pon un título</title> <link href="css/bootstrap.min.css" rel="stylesheet" media="screen"> <!--Llamamos al archivo CSS --> </head> <body> <script src="js/jquery.min.js"></script> <!-- Importante llamar antes a jQuery para que funcione bootstrap.min.js --> <script src="js/bootstrap.min.js"></script> <!-- Llamamos al JavaScript de Bootstrap --> </body> </html>

29/7/14

PsExec de PsTools

Psexec

PsExec.exe \\nombreEquipo -i -d -s "c:\windows\notepad.
exe"
-i para que salga en la pantalla (en alguna prueba con
    el notepad salio todo la ventana negra, problemas de repintado)
-d para que no se quede la línea de comandos pillada hasta que se 
    acabe el proceso. Lo lanza, devuelve el promp y un número de
    proceso que usamos para matarlo luego.
-s Usa la cuenta del sistema para lanzar la aplicación. Soluciona
    el problema de que no se vea la ventana
La aplicación saca algo como esto

c:\windows\notepad.exe started on nombreEquipo with process ID 7452.
Y lo matamos remotamente (el usuario podría cerrarlo) con:

C:\Users\icrufra\Desktop\PSTools>pskill.exe \\nombreEquipo 7452
Si se quiere entrar en la máquina remota con otro usuario se pondría –u (usuario@dominio) y el programa pide la clave.

15/7/14

Crear un acceso directo (Link) desde C#

(Con .net 4)
Type ShellType = Type.GetTypeFromProgID("WScript.Shell");
dynamic Shell = Activator.CreateInstance(ShellType);
dynamic shortcut = Shell.CreateShortcut(@"c:\borrame.lnk");
shortcut.TargetPath = @"c:\Windows\Notepad.exe";
shortcut.WorkingDirectory = @"c:\Windows";
shortcut.Save();
(Esto es antiguo con .net 4 usar el anterior)
Basado en:
http://www.codeproject.com/Articles/3905/Creating-Shell-Links-Shortcuts-in-NET-Programs-Usi
Por debajo usa Windows Scripting Host con lo que hay que importar un com (ocx) para que funcione. Es un poco chapuza pero es lo que hay.
En el proyecto se añade la referencia a ese com:
  1. En el proyecto,
  2. añadir referencia,
  3. de tipo com,
  4. el nombre es: “Windows Script Host Object Model”
Desde ese momento deja hacer un:
using IWshRuntimeLibrary;
El código que crea un link al notepad en el escritorio sería:

var shell = new WshShell();
IWshShortcut  link = (IWshShortcut)shell.CreateShortcut((Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),"borrame.lnk")));
link.TargetPath = @"c:\windows\notepad.exe";
link.Save();

6/3/14

Obtener información de catálogo de Base de datos Access

DataTable t = Ctx.con.GetSchema(OleDbMetaDataCollectionNames.Columns);
StringBuilder sb = new StringBuilder();
foreach(DataRow r in t.Rows){
 foreach(DataColumn c in t.Columns){
  sb.Append(String.Format("{0}: {1}||",c.ColumnName,r[c.ColumnName]));
 }
 sb.AppendLine();
}
Clipboard.SetText(sb.ToString());
MessageBox.Show(sb.ToString());
DataRow []dr = t.Select("TABLE_NAME = 'AnoActual' and COLUMN_NAME = 'Ano'");
MessageBox.Show(dr[0]["TABLE_NAME"].ToString() + dr[0]["COLUMN_NAME"].ToString());

29/1/14

Salto de página en html

@media all {
   div.saltopagina{
      display: none;
   }
}
@media print{
   div.saltopagina{
      display:block;
      page-break-before:always;
   }
}
<div class="saltopagina"><div>

17/1/14

Compilar proyecto desde línea de comandos

msbuild UILog1.csproj /p:Configuration=Release /t:Clean
El msbuild está en:
C:\Windows\Microsoft.NET\Framework\v4.0.30319
Este ejemplo borraría la versión release. Sin el /t:Clean la crearía. También funciona con soluciones. Y es compatible con SharpDevelop.

14/1/14

Nlog a fichero por mes

Crearía un log a un fichero. Cada mes crea un fichero nuevo. El fichero está, en principio, en la misma carpeta que el ejecutable.
NLog.Targets.FileTarget ft = new NLog.Targets.FileTarget();
ft.FileName ="FicheroDeLog.txt";
ft.ArchiveEvery = FileArchivePeriod.Month;
NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(ft, LogLevel.Trace);
LogManager.Configuration.AddTarget("File",ft);
Logger logger = LogManager.GetCurrentClassLogger();

9/7/13

Recabar información del equipo en windows

WMI: Windows Management Instrumentation http://msdn.microsoft.com/en-us/library/windows/desktop/aa394586(v=vs.85).aspx
static void MostrarTodo(StringBuilder sb, string cad){
 ObjectQuery query = new ObjectQuery("Select * from " + cad);
 XmlOpen(sb,1,cad);
 ManagementObjectSearcher mos = new ManagementObjectSearcher(query);
 if(mos!=null){
  ManagementObjectCollection moc = mos.Get();
  if(moc != null){
   foreach (ManagementObject mo in moc) {
    PropertyDataCollection pdc = mo.Properties;
    if(pdc != null){
     foreach (PropertyData pd in pdc) {
      AppendProperty(sb, pd);
     }
    }else{
     sb.AppendLine("");
    }
   }
  }else{
   sb.AppendLine("");
  }
 }else{
  sb.AppendLine("");
 }
 XmlClose(sb,1,cad);
}
Se le llamaría con:
MostrarTodo(sb, "Win32_Desktop");
MostrarTodo(sb, "Win32_DesktopMonitor");
MostrarTodo(sb, "Win32_OperatingSystem");
MostrarTodo(sb, "Win32_StartupCommand");

   
MostrarTodo(sb, "Win32_LogicalDisk");
MostrarTodo(sb, "Win32_MappedLogicalDisk");
MostrarTodo(sb, "Win32_DiskDrive");

MostrarTodo(sb, "Win32_NetworkAdapter");
MostrarTodo(sb, "Win32_NetworkAdapterConfiguration");

12/6/12

Generación de Codigo en C#

Nota: Está el código en hithub https://github.com/IvanCruzFraguela/EjemploGeneracionCodigo

usings necesarios:


using System.CodeDom;
using System.CodeDom.Compiler;
Suponemos que hay 2 controles de Tipo TextBox llamados:
tbFuenteGenerado
tbErrores
la función que genera los objectos necesarios para definir el código a generar como ejemplo es:
private CodeCompileUnit GeneraCodigo(){
 //Unidad de Compilación (ensamblado)
 var cu = new CodeCompileUnit();
 cu.ReferencedAssemblies.Add("System.dll");//Ensamblados que enlaza (aunque este debería estar por defecto)
 //Espacio de nombres
 var n = new CodeNamespace("EjemploGeneracionCodigo1");
 cu.Namespaces.Add(n);
 n.Imports.Add(new CodeNamespaceImport("System"));//Espacios de nombres que utiliza este namespace para compilar
 //Clase
 var c = new CodeTypeDeclaration("ClaseGenerada");
 n.Types.Add(c);
 c.BaseTypes.Add(new CodeTypeReference(typeof(System.Timers.Timer)));//Su clase padre
 c.IsPartial = true;
 
 //Atributo de la clase
 CodeMemberField mf = new CodeMemberField(typeof(string),"_atributo");
 c.Members.Add(mf);
 //Propiedad de la clase
 CodeMemberProperty cp = new CodeMemberProperty();
 c.Members.Add(cp);
 cp.Attributes = MemberAttributes.Public | MemberAttributes.Final;//lo de Final para que no sea virtual (por defecto si es público es virtual)
 cp.Type = new CodeTypeReference(typeof(string));
 cp.Name = "atributo";
 CodeFieldReferenceExpression cfre = new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "_atributo"); 
 CodeMethodReturnStatement mrs = new CodeMethodReturnStatement(cfre);
 cp.GetStatements.Add(mrs);
 //Metodo de la clase
 CodeMemberMethod cmm = new CodeMemberMethod();
 c.Members.Add(cmm);
 cmm.Attributes = MemberAttributes.Public | MemberAttributes.Final;
 cmm.Name = "Metodo1";
 cmm.ReturnType = new CodeTypeReference(typeof(int));
 CodeParameterDeclarationExpression pde = new CodeParameterDeclarationExpression(typeof(int),"enteroDeEntrada");
 cmm.Parameters.Add(pde);
 pde = new CodeParameterDeclarationExpression(typeof(string),"cadenaDeEntrada");
 cmm.Parameters.Add(pde);
 //Declaración de variable
 CodeVariableDeclarationStatement vds = new CodeVariableDeclarationStatement(typeof(string),"aux",new CodePrimitiveExpression("Prueba1") );
 cmm.Statements.Add(vds);
 //Llamar a método arbitrario
  //variable a llamar y método
  CodeMethodReferenceExpression  ctr = new CodeMethodReferenceExpression(new CodeVariableReferenceExpression("Console"),"WriteLine");
  //Llamada en sí con sus parámetros
  CodeMethodInvokeExpression invoke1 = new CodeMethodInvokeExpression( ctr, new CodeExpression[] {new CodePrimitiveExpression("Hola mundo")} );
 cmm.Statements.Add(invoke1);
  
 
 //Código a pelo. Ojo no se puede generar, por ejemplo, un foreach.
 cmm.Statements.Add(new CodeSnippetStatement("foreach(string s in cadenas){"));
 cmm.Statements.Add(new CodeSnippetStatement("Console.WriteLine(s);"));
 cmm.Statements.Add(new CodeSnippetStatement("}"));
 mrs = new CodeMethodReturnStatement(new CodePrimitiveExpression(42));
 cmm.Statements.Add(mrs);
                          
 return cu;
}
el código para generar el fuente e incluso compilarlo desde aquí es:
 CodeCompileUnit cu = GeneraCodigo();
 CodeDomProvider dp = CodeDomProvider.CreateProvider("CSharp");
 //Imprimir el código
 StringWriter sw = new StringWriter();
 System.CodeDom.Compiler.IndentedTextWriter itw = new IndentedTextWriter(sw);
 CodeGeneratorOptions go = new CodeGeneratorOptions();
 go.BlankLinesBetweenMembers = false;
 dp.GenerateCodeFromCompileUnit(cu,sw,go);
 this.tbFuenteGenerado.Text = sw.ToString();
 
 //Compilar desde dom
 CompilerParameters cp = new CompilerParameters(new string[]{},"borrame.dll");
 CompilerResults cr = dp.CompileAssemblyFromDom(cp,cu);
 tbErrores.Text = "";
 foreach(CompilerError ce in cr.Errors){
  tbErrores.Text += String.Format("{0}){1} in {2} at line {3} column {4} isWarning{5}",ce.ErrorNumber,ce.ErrorText,ce.FileName,ce.Line,ce.Column,ce.IsWarning);
 }

En teoría se podría generar tanto VB con C# pero supongo que con el uso se abusará de CodeSnippetStatement (“pon esto y no preguntes”) dado que hay construcciones importantes de C# (foreach, using) que no se pueden generar como tal con lo que solo se podrá generar C#.
Referencias:

25/4/12

Rebol: Grabar lista de objetos y recuperarla

REBOL[title: "Grabar y recuperar lista de objetos"]

obj1: make object![
 id: 1
 nomb: "Uno"
]

obj2: make object![
 id: 2
 nomb: "Dos"
]

lObj: copy []

append/only :lObj to-block obj1 ; only para que inserte como bloque y to-block para que haga un bloque del objeto.
        ; no mola nada esta forma de hacer las cosas
        ; ¿Qué diferencia hay entre un bloque y un objeto en realidad?
append/only :lObj to-block obj2

print mold lObj ; para ver lo que rebol grabaría

fich: %ListaObjectos.r 

save :fich :lObj

listaRecuperada: load :fich

print :listaRecuperada/1 ; imprimir primer elemento
print :listaRecuperada/2

Mercurial

* hg init <--Para crear el repositorio. Se ejecuta en el directorio a controlar.
* hg add <-- Para añadir la primera vez.
* hg ci -u ivancruz <-- Para hacer un commit
* hg log <-- Para ver las versiones
* hg update  <-- Para volver a una versión anterior

12/9/11

Compilando desde bajada de svn

svn co svn://desarrollo.dxx.xudicial.xunta.es/repositorio/csharp/InventarioDHCP_1.10
svn co svn://desarrollo.dxx.xudicial.xunta.es/repositorio/csharp/Util

cd InventarioDHCP_1.10
c:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\MSBuild /p:Configuration=Release
Baja el código a donde se encuentre el fichero .bat y lo compila.

24/5/11

Envío de teclas a aplicaciones (para pruebas automáticas)

Uno de los problemas se produce cuando se muestra un MessageBox. No hay manera de cerrarlo así que: a enviar teclas.

// Código para enviar las pulsaciones de teclas
Microsoft.VisualBasic.Interaction.AppActivate(f.Text);//Activa la aplicación. f es el formulario creado anteriormente para pruebas
f.Focus();// Hace falta también esto por lo visto.
Util.EnviarTeclas(5000, "{TAB}");//Cuadro de diálogo. Pasar a "no"
Util.EnviarTeclas(6000, "{ENTER}");//Cuadro de diálogo. ENTER.

// Código en Utils
    public static void EnviarTeclas(int TiempoEspera, string teclas) {
      Thread t = new Thread(new ParameterizedThreadStart(AEjecutarPorEnvioTeclas));
      EnvioTeclas et = new EnvioTeclas(TiempoEspera,teclas);
      t.Start(et);

    }
    public static void AEjecutarPorEnvioTeclas(Object EnvTecl) {
      EnvioTeclas aux = EnvTecl as EnvioTeclas;
      Thread.Sleep(aux.espera);
      SendKeys.SendWait(aux.teclas);
    }
  public class EnvioTeclas {
    public int espera;
    public string teclas;
    public EnvioTeclas(int espera, string teclas) {
      this.espera = espera;
      this.teclas = teclas;
    }
  }

16/5/11

Crear filas de prueba

A destacar el tema de que hay que crear una tabla para incluir la fila en ella.

private static DS.AGPROVRow _ProvRow;
public static DS.AGPROVRow ProvRow {
get {
if (_ProvRow == null) {
DS.AGPROVDataTable aux = new DS.AGPROVDataTable();
_ProvRow = aux.NewAGPROVRow();
_ProvRow.ID = 99;
_ProvRow.NOMB = "Prueba Grabar 1";
}
return _ProvRow;
}
}

27/4/11

Comparar el contenido de dos filas

public static bool ContenidoRowsEsIgual<T>(T row1, T row2) where T : DataRow {
bool result = true;
if (!row1.GetType().Equals(row2.GetType())) {
throw new Exception("Las filas no son del mismo tipo");
}
DataRow r1 = row1 as DataRow;
DataRow r2 = row2 as DataRow;
for (int i = 0; i < r1.ItemArray.Length; i++) {
if (!r1[i].Equals(r2[i])) {
result = false;
}
}
return result;
}

24/11/10

Mostrar Fechas en Oracle

Mostrar fecha y hora
to_char(campo_fecha,'DD/MM/YYYY HH24:MI:SS')

Para probarlo:
select to_char(sysdate,'DD/MM/YYYY HH24:MI:SS') from dual;


Más información en:
http://www.oradev.com/oracle_date_format.jsp

12/11/10

Roles de un usuario de windows

Adaptado de código de Jose Manuel Alarcón.

de la página: http://www.netveloper.com/2004/12/c%C3%B3mo-obtener-los-roles-a-los-que-pertenece-un-usuario-de-windows/

Me falló como a Javier Carrillo y lo solucioné con:


using System;
using System.Collections;
using System.Security.Principal;
using System.Reflection;
using System.IO;
public
class Prueba
{
public static void Main()
{
StreamWriter sw = File.CreateText("roles.txt");
foreach (IdentityReference Role in WindowsIdentity.GetCurrent().Groups.Translate(typeof(NTAccount)))
{
Console.WriteLine(Role.Value);
sw.WriteLine(Role.Value);
}
Console.ReadLine();
sw.Close();
}
}

27/7/10

Añadir consultas a un DataAdapter por código

El problema es que si se hace gráficamente, al rehacer el DataSet, se borran.
Para solucionarlo hay que heredar del DataAdapter generado y crear los Fill que se quieran.

public class AdapterModificado : DSTableAdapters.EnteTableAdapter
{
public void FillByNif(DS.EnteDataTable t,string nif)
{
SqlCeCommand aux = this.CommandCollection[0];
this.CommandCollection[0] = new SqlCeCommand("select * from ente where nif = @nif");
this.CommandCollection[0].Connection = this.Connection;
this.CommandCollection[0].Parameters.Add("@nif", nif);
this.Fill(t);
this.CommandCollection[0] = aux;
}
}

13/4/10

Usar servicios Web desde C# cómodamente

Se usa
wsdl.exe

Se encuentra por ejemplo en:
C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin

Hay que estar en la carpeta correspondiente y desde línea de comandos usar
wsdl [URL servicio]

genera un fichero de c# (por defecto) con el que poder llamar a los métodos web
Ejemplo:
wsdl http://localhost/Service1.asmx


Para usarlo:

serv = new Service1();
serv.Url = @"http://localhost/Service1.asmx";
serv.CookieContainer = new System.Net.CookieContainer();

serv.MetodoWeb("Dato para método",5); // El fichero generado tiene los métodos web como métodos normales del objeto

Sql Server desde línea de comandos (sqlcmd)

Se usa
sqlcmd

Está en
C:\Program Files\Microsoft SQL Server\100\Tools\Binn

Las mayúsculas y minúsculas son importantes (curioso en Windows)

sqlcmd -S [nombre instancia servidor] -d [nombre bd] -i [fichero a ejecutar]

ejemplo

sqlcmd -S localhost\SQLExpress -d PruebaBD1 -i creacion_tablas.sql

21/2/10

Metadatos en sql server

Nombres de tablas en una base de datos
SELECT name FROM SYSOBJECTS WHERE XTYPE='U';

Nombre de restricciones forenign key
SELECT * FROM SYSOBJECTS WHERE XTYPE='F';

Nombres de Primary keys
SELECT * FROM SYSOBJECTS WHERE XTYPE='PK';

Nombres de Campos de una tabla
Select name from syscolumns where id=object_id('tabla');

16/2/10

Compilación dll c# desde línea de comandos


csc /t:library /out:tiendalib.dll TiendaLib\TiendaLibBD.cs Tiendalib\
directorions\directorio.cs /lib:Utils\bin\Debug /reference:utils.dll


/t: <-- tarjet library = dll
/out: fichero de salida
lista de ficheros fuente
/lib: lista de directorios de donde cojer las dll
/reference: lista de ficheros dll referenciados

22/12/09

Oracle: Tablas que dependen de una dada


select CC.TABLE_NAME TablaQueReferencia,CC.COLUMN_NAME CampoDeEnlace,CC.POSITION PosicionDelCampo,C.CONSTRAINT_NAME NombreDelConstraint from all_constraints c
left join all_cons_columns cc
on c.constraint_name like cc.constraint_name
where c.constraint_type like 'R' -- Referencia
AND R_CONSTRAINT_NAME IN (SELECT CONSTRAINT_NAME FROM ALL_CONSTRAINTS WHERE
CONSTRAINT_TYPE LIKE 'P' -- Clave primaria
AND TABLE_NAME LIKE 'SERVIDORDAT')-- Nombre de la tabla a buscar sus dependientes
AND C.OWNER LIKE 'DESAR' AND CC.OWNER = 'DESAR'-- Nombre del esquema si hay varios
order by 1,2,3;

Hay que cambiar al nombre de la tabla y borrar lo del esquema si no hace falta.
Fundamental para poder borrar una tabla y saber qué otras tablas tienen referencias a ella.

Palabras clave (para búsqueda)
Oracle foreing key drop table clave foranea clave externa borrar tabla dependientes constraint constraints

31/7/09

Crear campo de tabla padre

Permite mostrar valores de nombre en tablas que solo almacenan el Id.

dsOracle.EQUIPODAT.Columns.Add("NombMotivoBaja", typeof(string), "Parent(FK_Equipodat_Motivo_Baja).nombre");

dsOracle == El dataset
EQUIPODAT == La tabla.
importante el: Parent(la relación).el_campo

3/7/09

DataBinding con DateTimePicker

Un coñazo. Además no había encontrada nada en Internet que me funcionase.
La parte de código maneja el evento del parse y el format había que ponerlo en alguna clase común.

Hay que crear una variable en la clase para almacenar el binding y poder referenciarlo desde el FormClosing.

Binding BindingFIni;


En el constructor. Yo lo paso a un “InicializarComponentes()”

private void InicializarComponentes() {
BindingFIni = new Binding("Value", Program.dm.OrganoBindingSource, Program.dm.dsOracle.ORGANO.FINIColumn.ColumnName);
BindingFIni.Format += new ConvertEventHandler(BindingFIni_Format);
BindingFIni.Parse += new ConvertEventHandler(BindingFIni_Parse);
this.dtpFIni.DataBindings.Add(BindingFIni);
this.dtpFIni.Value = DateTime.Today;// Sin estas 2 líneas no funciona, lo que no se es porqué.
BindingFIni.WriteValue();// Línea necearia
// Ojo: Tambien es neceario incluir líneas en el FormClosing
}

El código de los eventos es:

void BindingFIni_Parse(object sender, ConvertEventArgs e) {//Se llama al grabar
DateTimePicker dtp = ((Binding)sender).Control as DateTimePicker;
if (dtp != null && !dtp.Checked) {
e.Value = DBNull.Value;
}
}
void BindingFIni_Format(object sender, ConvertEventArgs e) {// Se llama al leer
if (e.Value is System.DBNull) {
DateTimePicker dtp = ((Binding)sender).Control as DateTimePicker;
e.Value = DateTime.Today;
dtp.Checked = false;
}
}

Por último al final del “FormClosing” hay que eliminar el Binding porque si no se ejecutan los eventos pese a que el formulario esté cerrado.

private void FE_FormClosing(object sender, FormClosingEventArgs e) {
//Aquí las comprovaciones necesarias
if (!e.Cancel) {
// Si no se hace esto sigue ejecutando el format aunque este formulario esté cerrado.
this.dtpFIni.DataBindings.Remove(this.BindingFIni);
}
}

11/6/09

.net .WinForms. Formulario Edición sencillo.

Tiene validación y controla si se han producido cambios para salir.
Atención a que los "EndEdit" son del BindingSource (por lo que actualiza en todos los sitios que se muestra la fila) y el r.HasVersion(DataRowVersion.Proposed))
para comprobar si se han realizado cambios (el R.rowstate no se actualiza hasta que se ha hecho el "EndEdit" momento en el que no se podrían cancelar los cambios)

Para llamar al formulario según sea Creación o modificación.

internal static void RolCrear() {
dm.rolBindingSource.AddNew();
dm.RolActual.CODIGO = -1;
(new Rol.FE()).ShowDialog();
}
internal static void RolModificar() {
(new Rol.FE()).ShowDialog();
}


Formulario en sí

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace InventarioDHCP.Rol {
public partial class FE : Form {
public FE() {
InitializeComponent();
InicializarComponentes();
}
private void InicializarComponentes() {
this.tbNombre.DataBindings.Add("Text", Program.dm.rolBindingSource, Program.dm.dsOracle.ESPECIALIDAD.NOMBREColumn.ColumnName);
}
private void btnSalir_Click(object sender, EventArgs e) {
this.Close();
}
private void btnGrabar_Click(object sender, EventArgs e) {
this.GrabarYSalir();
}
private void GrabarYSalir() {
if (this.Grabar()) {
this.Close();
}
}
private bool Grabar() {// Devuelve true si fue capaz de grabar
bool result = false;
if (this.EsValido()) {
Program.dm.rolBindingSource.EndEdit();
Program.dm.RolGrabar(Program.dm.RolActual, null);
result = true;
}
return result;
}
private bool EsValido() {
bool result = true;
this.errorProvider1.Clear();
if (this.tbNombre.Text.Equals("")) {
result = false;
this.errorProvider1.SetError(this.tbNombre, "Se ha de indicar un nombre");
}
return result;
}
private void FE_FormClosing(object sender, FormClosingEventArgs e) {
DSOracle.ROLRow r = Program.dm.RolActual;
if (r.HasVersion(DataRowVersion.Proposed)) {// Si no ha cambiado no hacer nada
DialogResult dr = MessageBox.Show("¿Desea grabar los cambios?", "Atención:",
MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
switch (dr) {
case DialogResult.Yes: {
if (!this.Grabar()) {//Si no es capaz de grabar que no salga del formulario
e.Cancel = true;
}
break;
}
case DialogResult.No: {// Si no quiere grabar, cancelar la edición
Program.dm.rolBindingSource.CancelEdit();
break;
}
case DialogResult.Cancel: {// Si cancela no hacer nada pero tampoco salir del formulario
e.Cancel = true;
break;
}
default: {
throw new Exception("Respuesta no contemplada");
}
}
}
}
}
}


Grabación

public void RolGrabar(DSOracle.ROLRow r, OracleTransaction Trans) {
// Atención si se nos produce un error de compilación en las lineas siguientes hay que ir a la definición de Adapter y cambiarlo por public.
// Esto pasará cada vez que cambiemos algo en DSOracle.
this.rolTableAdapter.Adapter.InsertCommand.Transaction
= this.rolTableAdapter.Adapter.UpdateCommand.Transaction
= this.rolTableAdapter.Adapter.DeleteCommand.Transaction
= Trans;

if (r.RowState == DataRowState.Added) {
r.CODIGO = Util.OracleGetSequence(conOracle, "Rol_SEQ", Trans);
}
rolTableAdapter.Update(r);
}

20/4/09

Grids en asp.net

En el pageload

if (!IsPostBack) {
PrepararGrid();
}
private void PrepararGrid() {
this.GridView1.DataKeyNames = { "Codigo" };//lista de campos que forman la clave primaria

this.SqlDataSource.SelectCommand = “Select Codigo, nombre from tabla”;// Consulta para rellenar el grid

//Añadir las columnas y botones
UtilWeb.AnadirColumnaText(this.GridView1, "nombre", "NOMBRE");
UtilWeb.AnadirColumnaBoton(this.GridView1, “AnadirAGenerarDat”, "Generar Fichero Dat");
UtilWeb.AnadirColumnaBoton(this.GridView1, “VerEquiposServidor”, "Ver Equipos");
}

public static void AnadirColumnaBoton(GridView gv, string Comando, string TextoBoton) {
ButtonField btnf;
btnf = new ButtonField();
btnf.ButtonType = ButtonType.Button;
btnf.CommandName = Comando;
btnf.HeaderText = "";
btnf.Text = TextoBoton;
gv.Columns.Add(btnf);
}

public static void AnadirColumnaText(GridView gv, string Campo, string Cabecera, bool visible) {
BoundField bf;
bf = new BoundField();
bf.DataField = Campo;
bf.HeaderText = Cabecera;
bf.ReadOnly = true;
bf.Visible = visible;
gv.Columns.Add(bf);
}
public static void AnadirColumnaText(GridView gv, string Campo, string Cabecera) {
AnadirColumnaText(gv, Campo, Cabecera, true);
}

Al pulsar los botones que hemos añadido al grid se ejecuta el “RowCommand”.

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) {
// el e tiene:
//e.CommandArgument : La posicion en la que se ha pulsado el botón
//e.CommandName : El nombre del comando ”Lo hemos dado al crear el botón”
//e.CommandSource

int position = Convert.ToInt32(e.CommandArgument);
DataKey dk = this.GridView1.DataKeys[position];
decimal ServidorId = Convert.ToDecimal(dk.Value);// Si es una clave con varios campos dk.Values[X]

switch (e.CommandName) {
case “AnadirAGenerarDat”: {
//Acción con el botón correspondiente
break;
}
case “VerEquiposServidor”: {
//Acción con el botón correspondiente
break;
}
}
}

19/2/09

Manejo VirtualBox

Utilidades para arrancar la máquina sin hacerlo interactivamente.


Arrancar máquina virtual desde línea de comandos:
VBoxManage startvm "NombreMaquina"

Pausar una máquina desde línea de comandos:
VBoxManage controlvm "NombreMaquina" savestate

Copiar una máquina virtual (copia el disco duro. La máquina virtual hay que crearla y asignarle el nuevo disco duro creado):
VBoxManage clonevdi Fuente.vdi Destino.vdi

12/2/09

ASP.NET: Paso de Rows a Textboxes y viceversa

En Web no hay databinding salvo en grids. Hacen falta estas cosas para pasar los datos de la fila al formulario de de vuelta a la tabla en los formularios de edición



public static void SetTextOrNull(TextBox textBox, DataRow r, DataColumn dataColumn) {
if (textBox.Text.Equals("")) {
r[dataColumn] = System.Convert.DBNull;
} else {
r[dataColumn] = textBox.Text;
}
}

public static void GetTextOrNull(TextBox tb, DataRow r, DataColumn dataColumn) {
if (r[dataColumn].Equals(System.Convert.DBNull)) {
tb.Text = "";
} else {
tb.Text = r[dataColumn].ToString();
}
}


Hay que pasarles el textbox la Row y el nombre de la columna es una variable en la tabla (gracias a que la genera como pública).

30/9/08

Añadir valor nulo en un comboBox asp.net (dropdownlist)

Hay que asignar a true la propiedad AppendDataBoundsItems.


this.comboLocalidad.AppendDataBoundsItems = true;
this.comboLocalidad.Items.Add(new ListItem("Sin asignar", "0"));

El valor 0 tendrá que ser tratado al grabar como nulo.

19/9/08

Curioso juego de programación

http://www.gameroo.nl/games/light-bot

palabras clave:
juego programación interesante aprendizaje chorrada

16/9/08

Para modificar o eliminar un registro de un GridView de asp. net.

Palabras clave:
GridView, Posición, Posicionar, modificar, eliminar, RowCommand, DataKeys, Grid, Rejilla.

// e.CommandArgument.ToString(). Nos devuelve una cadena con la posición en el grid en la que se ha pulsado el botón.
// Para obtener la clave primaria de la fila pulsada hemos de definir en el GridView en su propiedad “DataKeyNames” los nombres de los campos que forman la clave primaria a mano antes de empezar.
DataKey dk = this.GridView1.DataKeys[Int32.Parse(e.CommandArgument.ToString())];
// El dk obtiene la lista de valores para acceder al segundo se pone el [1]
this.Title = dk.Values[1].ToString();

Una vez obtenida la clave primaria ya se puede obtener el objeto a modificar.

14/7/08

Tamaño de la barra de windows

La barra mide 22 puntos.
si a 768 ( de 1024 x 768) le restamos 22 tenemos que para aplicaciones podemos tener:

746 puntos de alto.

19/6/08

Creación de tabla en oracle


CREATE table "S" (
"A" NUMBER(5,5) NOT NULL,
"C" VARCHAR2(4000),
constraint "S_PK" primary key ("A")
)
/

CREATE sequence "S_SEQ"
/

CREATE trigger "BI_S"
before insert on "S"
for each row
begin
select "S_SEQ".nextval into :NEW.A from dual;
end;
/

ALTER TABLE "S" ADD CONSTRAINT "S_FK"
FOREIGN KEY ("C")
REFERENCES "TABLA1" ("ID")

/

23/4/08

Netbeans jsf oracle + Primera inserción que funciona

Necesita un messageGroup1

int id = 31;
String nomb = "Treinta y uno";
Connection con = null;
try {
InitialContext ic = new InitialContext();
//en esta parte es donde ponemos el Nombre
//de JNDI para que traiga el datasource
DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/HR_Oracle");
con = ds.getConnection();
Statement st = con.createStatement();
try{
String com = "insert into TABLA1(id,nomb) values ("
+ Integer.toString(id)
+ ",'"
+ nomb
+ "')";
info(com);
int executeUpdate = st.executeUpdate(com);
info(Integer.toString(executeUpdate));
}catch(SQLException ex){
error(ex.getMessage());
}
//el resultSet es el encargado de traer los datos de la consulta
ResultSet rs = st.executeQuery("select * from TABLA1");
while (rs.next()) {
info(" " + rs.getString(1) + " " + rs.getString(2));
}
} catch (SQLException ex) {
error(ex.getMessage());
} catch (Exception exx) {
error(exx.getMessage());
}

4/3/08

Fila actual de un BindingSource

Actualización: Parece que esto funcionaría y compacta el código.

return (this.BaseDeDatosBS.Current as DataRowView).Row as DS.BaseDeDatosRow;
// Si no hay Current devolvería un null.


Sirve para acceder al elemento actual de un binding source con el tipo de fila adecuado.

public DS.JuzgadoRow JuzgadoActual {
get {
DS.JuzgadoRow result = null;
if (this.JuzgadoBs.Current != null) {
DataRowView drw = this.JuzgadoBs.Current as DataRowView;
result = drw.Row as DS.JuzgadoRow;
}
return result;
}
}

28/11/07

Text de solo números

Debería ser con change. De hecho falla si le pegamos letras pero es lo que hay.
Se permiten números y carateres de control (si no se permiten los caracteres de control el borrar falla)


private void textAno_KeyPress(object sender, KeyPressEventArgs e) {
e.Handled = !(Char.IsNumber(e.KeyChar) || Char.IsControl(e.KeyChar));
}


21/11/07

Campo calculado en un DataTable de un DataSet .net

Program.dm.ds.Proc.Columns.Add("TipoProcNomb", typeof(string), "Parent(FK_TipoProc_Proc).nomb");

(habría que explicarlo más)

17/10/07

Databinding ComboBox C#


ComboBox.DataSource = Program.dm.TipoProcBindingSource; //BindingSource a mostrar
ComboBox.DisplayMember = "nomb"; // Campo nombre
ComboBox.ValueMember = "id"; // Campo valor
ComboBox.DataBindings.Add( // enlace con el campo donde se guarda el valor
new Binding("SelectedValue", // La propiedad de SelectedValue ( no value)
Program.dm.procBindingSource, // Bindingsource de la tabla en la que grabamos el valor
"idTipoProc" // nombre del campo en el que guardamos el valor
));

4/10/07

Comprobar permisos al ejecutar aplicación .net

Sacado de campusMVP

private static bool CheckFullTrust()
{
try
{
// Demandar Full Trust
new PermissionSet(PermissionState.Unrestricted).Demand();
return true;
}
catch (SecurityException)
{
try
{
// No estamos en Full Trust, se lo contamos al usuario
MessageBox.Show("La aplicación necesita Full Trust");
}
catch (SecurityException)
{
// La aplicación no tiene permisos mostrar mensajes... :(
//Logeamos lo ocurrido
}
}
return false;
}

27/7/07

Generar avisos de compilación en C#

Sirve para poner Wanings al darle a compilar por ejemplo para indicar cosas que quedan por hacer o pruebas en código.


private void grabacionCrear() {
#warning grabacionCrear sin hacer
}

19/7/07

Hacer un DataGridView de solo lectura.


ReadOnly = true;
AllowUserToAddRows = false;
AllowUserToDeleteRows = false;
SelectionMode = DataGridViewSelectionMode.FullRowSelect;

5/7/07

Textbox con solo números

(Copiado de www.buayacorp.com)
public Form1()
{
InitializeComponent();

textBox1.KeyPress += new KeyPressEventHandler(textBox1_KeyPress);
}
void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
// Permitir sólo las teclas de control o números
if (!(char.IsControl(e.KeyChar) || char.IsDigit(e.KeyChar)))
{
e.Handled = true;
}
}

7/6/07

Acceder a un fichero en el servidor desde página ASP

DataSet dataset = new DataSet();
dataset.ReadXml ( Server.MapPath("fichero.xml") );

Esto accedería a "fichero.xml" en donde se encuentre instalada la aplicacion.

12/4/07

String.format en Java


Para fechas:
String.format("%1$te/%1$tm/%1$tY",[variable calendar]);
Para números enteros:
String.format("%1$d",[variable entera]);
Para double / float:
String.format("%1$.2f",[variable double o float]); // saca el nº con 2 decimales

21/3/07

HTML: Label más text en HTML

Para que quede bien el típico texto con un input box en html, es decir, el label sobre el input y alineado a la izquierda con el mismo.
(ver el código de la página)

Buscar

7/3/07

Java. Detectar una cambio en la selección de un JTable

Sirve por ejemplo para mostrar un dato a mayores sobre el registro que se muestra en la tabla en otra parte del formulario.
Hay que cambiar el "modelo de seleccionador" en principio el ponemos que solamente se pueda seleccionar una sola fila y luego definimos una clase para que se llame al evento y se la añadimos al "modelo de seleccionador" en el evento "Selection". (Pa flipá vamos. Lo que se echa de menos un "OnSelect" de toda la vida)

this.jTable1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);/* lo de que solamente se pueda seleccionar una fila.*/

lsm = this.jTable1.getSelectionModel();
lsm.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e){
MetodoALlamarCuandoCambiaLaSeleccion();
}
};

Para saber la fila seleccionada se usa el método del JTable.getSelectedRow().

java String.format

"%" + posicion del parámetro + "$" + tipo de dato

para formatear cadenas: "s"
String.format(" la cadena %1$s", "es muy bonita") --> la cadena es muy bonita

para formatear enteros: "d"

String.format(" cantidad: %1$d", 4) --> cantidad: 4

1/3/07

Elementos en los jList ( los que muestran una lista cadenas para seleccionar (ListBox))

Un dolor cambiar los datos una vez cargados. Como siempre hay una clase vista (el jList) y una clase modelo (AbstractListModel, DefaultListModel). El netbeans les crea por defecto una clase anónima heredada de AbstractListModel en la que (manda webs el tema) NO SE PUEDE AÑADIR ELEMENTOS así que de necesitarlo (que será lo normal) habrá que asociar ( con setModel(modelo) ) al jList una instancia de la clase DefaultListModel a la que sí que se puede hacer de todo con los elementos y la vista se actualiza automáticamente con los cambios por lo visto (esto último no lo has probado).

Doble click en swing

Resulta que no hay evento doble click (pa flipá vamos) se usa el MouseClicked y se comprueba la cantidad de veces que se ha pulsado. Funciona bien el tema (y no se puede controlar un tercer click solo lo hace con 2 clicks)


private void lTablaMouseClicked(java.awt.event.MouseEvent evt) {
if (evt.getClickCount() >= 2){// si es doble click
JOptionPane.showMessageDialog(this,"Doble click"); }
}
}

Creación de un table model específico para un JTable

El enlace del título tiene un tutorial sobre el tema que no está mal. Pero en realidad lo que supongo que se hará es heredar de la clase AbstractTableModel e implementar los métodos abstractos.

http://www.chuidiang.com/java/tablas/tablamodelo/tablamodelo.php

20/2/07

Mini tutorial de action en Java

Un estilo al TAction de Delphi 4 pero años despues y teniendo que escribir código. En fin es lo que hay.

http://java.sun.com/docs/books/tutorial/uiswing/misc/action.html

29/1/07

Creación de pdfs desde java

Utilizar iText. Hay un libro y todo "iText in action". Permite además con los mismos comandos crear Htmls y rtfs.

11/1/07

Serialización de objectos en java


package pruebasserializacion;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Calendar;

/**
*
* @author ivancruz
*/
class Elemento implements Serializable{
int cod;
String nomb;
Calendar fNac;
public Elemento(int cod, String nomb, Calendar fNac){
this.cod = cod;
this.nomb = nomb;
this.fNac = fNac;
}
public String toString(){
return Integer.toString(cod) + "//" + nomb + DateFormat.getDateInstance().format(fNac.getTime());
}
}

public class Main {
final static String NOMBFICH = "d:\\borrame.serializacion";
public static void main(String[] args) throws IOException, ClassNotFoundException {
Main m = new Main();
ArrayList escribir = new ArrayList();
escribir.add(new Elemento(1,"Uno",Calendar.getInstance()));
escribir.add(new Elemento(2,"Dos",Calendar.getInstance()));

FileOutputStream fos;
fos = new FileOutputStream(Main.NOMBFICH);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(escribir);

//ArrayList leer;
FileInputStream fis = new FileInputStream(Main.NOMBFICH);
ObjectInputStream ois = new ObjectInputStream(fis);
ArrayList leer = (ArrayList)ois.readObject();
for(Elemento e:leer){
System.out.println(e);
}
}
}

13/11/06

Visita Simo 2006

www.solmicro.com: ERP ampliable y configurable. Te dan el código fuente y generadores de código.

26/10/06

BENEDETTI

"POEMAS REVELADOS" (Libro en casa de Dunia)
  • "NO TE SALVES"
    • "NO QUIERAS CON DESGANA"
  • "DEFENSA DE LA ALEGRIA"
    • Casi completo
  • "LA TREGUA"
    • Trabajar de camarero
  • "EL OLVIDO"
    • "EL OLVIDO NO ES VICTORIA"
    • "NO OLVIDA EL QUE FINGE OLVIDO,
      SINO EL QUE PUEDE OLVIDAR"

13/8/06

HTML Base

Tabla con 3 zonas e imágenes de fondo.

<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<title>TODO supply a title</title>
</head>
<body style="margin:0px;padding:0px">

<table style="valign:centered;text-align:center;width:100%;height:100%;border-spacing:0px">
<tr style="height:20%">
<td style="valign:centered;text-align:center;background-image:url('borrame.jpg')">

<h1>Encabezado</h1>
</td>
</tr>
<tr style="height:65%">

<td style="valign:centered;text-align:center;background-image:url('borrame.jpg')">
<p>cuerpo</p>
</td>

</tr>
<tr style="height:15%">
<td style="valign:centered;text-align:center;background-image:url('borrame.jpg')">

<p>pie</p>
</td>
</tr>
</table>
</body>

</html>

3/8/06

¿Qué debe incluir un caso de uso?

Actor Principal
Precondiciones
Postcondiciones
Flujo Básico
Flujos Alternativos
Requisitos especiales
Frecuencia

Web sobre el tema "usecases.org"

23/6/06

Java: Leer una url



try{
java.net.URL url = new java.net.URL("http","www.ya.com",80,"");
java.io.InputStream is = url.openStream();
System.out.println("[ya.com]");
int c;
while ((c = is.read()) != -1){
System.out.write(c);
}
System.out.println("[ya.com fin]");
}catch(Exception e){
e.printStackTrace();
}

5/6/06

Interesante historia acerca de pasar de Windows a Linux

La escribio usuario de barrapunto conocido como "year of the dragon". Es una ida de olla interesante y amena. La conclusión es que utilices programas compatibles Windows y Linux (normalmente software libre) para ir pasando poco a poco hasta que windows no te haga falta.
(para verla pulsar sobre el título del artículo)

Mostrar tablas de un esquema de Oracle


Select * from cat

Nota: Información de catálogo.

25/4/06

Truquillos chorras

Truquillos chorras que te han hecho falta de Operador de Ordenador en Familia
Copiar ficheros
xcopy /e /c /h /r /k /z *.* dest\
Actualizar la hora del equipo a la del dominio
runas /user:familia\Administrador "net time /Domain:Familia /set"
Dir mostrando ocultos
dir /A
Instalar el redistribuible del .net
dotnetfx.exe /q /c:"install.exe /q"

30/3/06

ComboBox en .Net

  
this.cbMunicipio.DropDownStyle = ComboBoxStyle.DropDownList;
this.cbMunicipio.DataSource = Program.dm.ProvinciaMunicipioBindingSource; //BindingSource a mostrar
this.cbMunicipio.DisplayMember = Program.dm.dsOracle.MUNICIPIO.NOMBREColumn.ColumnName; // Campo nombre
this.cbMunicipio.ValueMember = Program.dm.dsOracle.MUNICIPIO.CODIGOColumn.ColumnName; // Campo valor
this.cbMunicipio.DataBindings.Add( // enlace con el campo donde se guarda el valor
new Binding("SelectedValue", // La propiedad de SelectedValue ( no value)
Program.dm.OrganoBindingSource, // Bindingsource de la tabla en la que grabamos el valor
Program.dm.dsOracle.ORGANO.CODIGO_MUNICIPIOColumn.ColumnName // nombre del campo en el que guardamos el valor
));

Conexión con Bd Access

Los 2 parámetros imprescindibles son:
  • Provider=Microsoft.Jet.OLEDB.4.0;

  • Data Source='"+d.FileName+"'"

Ejemplo completo:
System.Data.OleDb.OleDbConnection con = new OleDbConnection("Provider='Microsoft.JET.OLEDB.4.0';Data source = 'o:\datos\prueba1.mdb'");


Con clave:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\mydatabase.mdb;Jet OLEDB:Database Password=MyDbPassword;

Leer autonumricos de Access y Sql Server(Identity)


     OleDbConnection con = new OleDbConnection(CadCon);
     OleDbCommand cmd = OleDbCommand("SELECT @@IDENTITY", con);
     int clave = (int) cmdIdentidad.ExecuteScalar();

Ejemplo de Semáforos con C#

Mutex m = new Mutex();
m.WaitOne();
if (instancia == null){
     instancia = new ClaseUnica();
}
m.Close();

27/3/06

Cadenas en C#

Cadenas en C#

Para que no interprete los caracteres de “\” en una cadena y tener que poner “\\” en las rutas de directorio se puede poner una arroba “@” delante de la cadena y listo.
Ejemplo:
Ruta = “c:\\path\\fichero”
Ruta = @”c:\path\fichero”

Si queremos tener una cadena en la que se valla construyendo una más larga debemos usar el StringBuilder por cuestiones de rendimiento.

22/2/06

Formulario C# con creación de controles a pelo



using System;
using System.Drawing;
using System.Windows.Forms;

namespace pruebas1
{
///
/// Description of EdicionConControles.
///

public partial class EdicionConControles
{
//Controles a los que es necesario acceder desde código del formulario
private TextBox tbAlias;
private TextBox tbNombre;

public void InicializarControles(){
// Panel Datos
FlowLayoutPanel flpDatos = new FlowLayoutPanel();
flpDatos.Parent = this;
flpDatos.Dock = DockStyle.Fill;
flpDatos.BackColor = Color.Cyan; // para ver donde acaba

// Alias
Panel panelAlias = new Panel();
panelAlias.Parent = flpDatos;
panelAlias.BackColor = Color.AliceBlue;

Label labelAlias = new Label();
labelAlias.Parent = panelAlias;
labelAlias.Text = "Alias";
labelAlias.Top = 2;
labelAlias.Left = 2;
labelAlias.Height = 12;

/* definido fuera*/
tbAlias = new TextBox();
tbAlias.Parent = panelAlias;
tbAlias.Left = 2;
tbAlias.Top = 2 + labelAlias.Height + 2;

panelAlias.Height = 2 * 3 + labelAlias.Height + tbAlias.Height;
panelAlias.Width = 2 * 2 + tbAlias.Width;

//nombre
Panel panelNombre = new Panel();
panelNombre.Parent = flpDatos;
panelNombre.BackColor = Color.AliceBlue;

Label labelNombre = new Label();
labelNombre.Parent = panelNombre;
labelNombre.Text = "Nombre";
labelNombre.Top = 2;
labelNombre.Left = 2;
labelNombre.Height = 12;

//Definido fuera
tbNombre = new TextBox();
tbNombre.Parent = panelNombre;
tbNombre.Left = 2;
tbNombre.Top = 2 + labelNombre.Height + 2;

panelNombre.Height = 2 * 3 + labelNombre.Height + tbNombre.Height;
panelNombre.Width = 2 * 2 + tbNombre.Width;

// Panel Botones
FlowLayoutPanel flpBotones = new FlowLayoutPanel();
flpBotones.Parent = this;
flpBotones.Dock = DockStyle.Bottom;
flpBotones.BackColor = Color.Red;// para ver donde acaba
flpBotones.Height = 27; //23 del boton estándar más 4

// botón grabar
Button bGrabar = new Button();
bGrabar.Parent = flpBotones;
bGrabar.Click += new EventHandler(bGrabarClick);
//void bGrabarClick(object sender, System.EventArgs e)
bGrabar.UseVisualStyleBackColor = true;
bGrabar.Text = "Grabar";

// botón salir
Button bSalir = new Button();
bSalir.Parent = flpBotones;
bSalir.Click += new EventHandler(bSalirClick);
//void bGrabarClick(object sender, System.EventArgs e)
bSalir.UseVisualStyleBackColor = true;
bSalir.Text = "Salir";
}

public EdicionConControles()
{
//
// The InitializeComponent() call is required for Windows Forms designer support.
//
InitializeComponent();

this.InicializarControles();
}

void bGrabarClick(object sender, System.EventArgs e)
{
MessageBox.Show("Botón de grabar");
}

void bSalirClick(object sender, System.EventArgs e)
{
MessageBox.Show("Botón de Salir");
}

}
}