Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-05-2014
webmasterplc webmasterplc is offline
Miembro
 
Registrado: mar 2008
Posts: 274
Poder: 17
webmasterplc Va por buen camino
Concatenar un numero determinado de palabras con el contenido de un array

Buenas Tengo una función la cual me hace el envio de sms a travez de un gateway, esta funcion lo hace correctamente, para enviar masivos hago la consulta sql y la cargo en un array y luego hay un ciclo recorriendo el array pro a veces son 1000 registros y tarda mucho y a veces me da un error,el gateway me permite concatenar numeros con ; hasta 500 y alli hace una sola petición pos miestras que como lo hago hace 1000 peticiones, como podre hacer para concatenar y eliminar el ultimo numero el punto y coma que le queda al final este es el codigo.
Código Delphi [-]
function enviarSMS (phone,mensaje : string) : string; 
var
  http: TIdHttp;   
  params: TStrings;   
  respuesta: string;  
begin     
  http := TIdHTTP.Create(nil);     
  params := TStringList.Create;      
  begin         
    params.Add('usuario=miusuario');         
    params.Add('clave=AprilApril1979');         
    params.Add('telefonos='+phone);         
    params.Add('texto='+mensaje);         
    respuesta := http.Post('http://www.enlinea-ve.com/webservices/' +           'SendSms', params);     
  end;     
  params.Free;     
  http.Free; 
end;
el array esta creado en la unidad

contactos: array of string;

y llamo la funcion asi
Código Delphi [-]
with datos.sqcontactos do
begin                 
  Close;                 
  SQL.Text:= 'SELECT * FROM vcontactos WHERE vcontactos.miem_clasificacion =: miem_clasificacion';                 
  ParamByName('miem_clasificacion').AsString:=cbbclasificacion.Text;
  Open;                     
  while not Eof do                     
  begin                       
    SetLength(contactos, Length(contactos)+1);                       
    contactos[High(contactos)] := FieldByName('celular').AsString;
    Next;                     
  end;               
end;      
try             
  for i:= Low(contactos) to High(contactos) do             
  begin              
    enviarSMS((Format('%s', [contactos[i]])),mmomensaje.Text);             
  end;           
finally             
  contactos:=nil;             
  lst1.Clear;             
  mmomensaje.Clear;             
  MessageDlg('Proceso de Envío de SMS Concluido Exitosmente', mtCustom, [mbOK], 0);            
end;
Lo Otro es que como ven solo paso el numero al array quisiera ver si es posible pasarle numero y nombre a un array para personalizar el mensaje de texto cuando sea necesario.

Gracias de Antemano

Última edición por Casimiro Notevi fecha: 10-05-2014 a las 16:28:41.
Responder Con Cita
  #2  
Antiguo 10-05-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola webmasterpcl.

Voy a empezar por el final.
Cita:
Lo Otro es que como ven solo paso el numero al array quisiera ver si es posible pasarle numero y nombre a un array para personalizar el mensaje de texto cuando sea necesario.
De este modo podes enviarle los datos que desees mediante un arreglo dinámico:
Código Delphi [-]
...
type
  TRecip = record
    Nombre: string;
    Numero: string;
    //...
  end;

var
  contactos: array of TRecip;

function enviarSMS (Recip: TRecip; Mensaje: string): string;
var
  http: TIdHttp;
  params: TStrings;
  respuesta: string;
begin
  http := TIdHTTP.Create(nil);
  params := TStringList.Create;
  try        
    params.Add('usuario=miusuario');
    params.Add('clave=AprilApril1979');
    params.Add('Nombre=' + Recip.Nombre);
    params.Add('telefonos=' + Recip.Numero);
    params.Add('texto=' + Mensaje);
    Result := http.Post('http://www.enlinea-ve.com/webservices/' + 'SendSms', params);
  finally
    params.Free;     
    http.Free;
  end;
end;

En el uso tendras que modificar:
Código Delphi [-]
  with datos.sqcontactos do
  begin                 
    Close;                 
    SQL.Text:= 'SELECT * FROM vcontactos WHERE vcontactos.miem_clasificacion =: miem_clasificacion';                 
    ParamByName('miem_clasificacion').AsString:=cbbclasificacion.Text;
    Open;                     
    while not Eof do                     
    begin                       
      SetLength(contactos, Length(contactos)+1);  
      //  * Aquí *
      contactos[High(contactos)].Nombre:= FieldByName('Nombre').AsString;                     
      contactos[High(contactos)].Numero:= FieldByName('celular').AsString;
      Next;                     
    end;               
  end;      
  try             
    for i:= Low(contactos) to High(contactos) do             
     enviarSMS(contactos[i], Memo1.Text);   // * Y aquí *    
  finally             
    contactos:=nil;             
    lst1.Clear;             
    mmomensaje.Clear;             
    MessageDlg('Proceso de Envío de SMS Concluido Exitosmente', mtCustom, [mbOK], 0);            
  end;

Cita:
...hasta 500 y alli hace una sola petición pos miestras que como lo hago hace 1000 peticiones, como podre hacer para concatenar y eliminar el ultimo numero el punto y coma que le queda al final este es el codigo.
No termino de comprender esta parte, pero para eliminar el último el último caracter de una cadena:
Código Delphi [-]
  
  SetLength(un_string, Length(un_string) - 1);

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 10-05-2014
webmasterplc webmasterplc is offline
Miembro
 
Registrado: mar 2008
Posts: 274
Poder: 17
webmasterplc Va por buen camino
Osea me gustaria contatenar de 500 en 500 separados por (;) pero si le agredo un punto y coma despues de cada numero me va a quedar un (;) al final y me dara error en vez de pasarle un numero a la vez le pasaria 584240000000;584260000000; y los enviaria e en una sola peticion 500 sms , lo que me respondiste esta genial para personalizar el mensaje pero cuando no quiero personalizarlo solo hago una sola peticion de numeros concatenados por ;

Última edición por Casimiro Notevi fecha: 10-05-2014 a las 22:24:34.
Responder Con Cita
  #4  
Antiguo 10-05-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola webmasterplc.
Cita:
Empezado por webmasterplc Ver Mensaje
Osea me gustaria contatenar de 500 en 500 separados por ( pero si le agredo un punto y coma despues de cada numero me va a quedar un ( al final y me dara error en vez de pasarle un numero a la vez le pasaria 584240000000;584260000000; y los enviaria e en una sola peticion 500 sms , lo que me respondiste esta genial para personalizar el mensaje pero cuando no quiero personalizarlo solo hago una sola peticion de numeros concatenados por ;
Entonces es como te sugerí en la última parte del mensaje anterior.

Hace esta simple prueba:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
begin
  s:= '584240000000;584260000000;584280000000;584300000000;';
  SetLength(s,Length(s)-1);
  ShowMessage(s);
end;
La variable s termina con el valor: '584240000000;584260000000;584280000000;584300000000' (sin finalizar en ";") que es precisamente lo que estas buscando.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 11-05-2014
webmasterplc webmasterplc is offline
Miembro
 
Registrado: mar 2008
Posts: 274
Poder: 17
webmasterplc Va por buen camino
lo que busco en realidad es enviarlo de dos formas a la funcion, una ir recorriendo el array numero por numero y haciendo la petición uno a la vez que me permitiria personalizar cada mensaje y de la otra recorrer el array y concatenar los numeros de 500 numeros en 500 y si hay mil solo hago dos peticiones de envio de sms
Responder Con Cita
  #6  
Antiguo 11-05-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola webmasterplc.

Por lo que comentas en el mensaje #3 la parte de personalizar ya la tenes encaminada, pero creo que no me has entendido sobre como procesar el punto y coma cuando envias el lote de 1000 mensajes.

A ver si con este ejemplo me explico mas claramente:
Código Delphi [-]
var
  h, l, m: Integer;
begin
  // Asumo que contactos ya tiene asignado los 1000 números
  l:= Low(contactos);
  m:= High(contactos) div 2;
  h:= High(contactos);

  // quitar ";" al contacto 500
  SetLength(contactos[m], Length(contactos[m])-1);
  // quitar ";" al contacto 1000
  SetLength(contactos[h], Length(contactos[h])-1);
  
  // Visualizar el resultado
  ShowMessage(Format('000-499: %s %s%s500-999: %s %s',
    [contactos[l],contactos[m],#10,contactos[m+1],contactos[h]]));
...
Cuando envíes "contáctos" como argumento los datos 500 y 1000 ya no terminarán en ";".

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 11-05-2014 a las 22:47:13.
Responder Con Cita
  #7  
Antiguo 12-05-2014
webmasterplc webmasterplc is offline
Miembro
 
Registrado: mar 2008
Posts: 274
Poder: 17
webmasterplc Va por buen camino
Gracias hermano ahorita voy a trabajar con esta, lo de concatenar lo tengo listo me faltaba esto, la cantidad de numeros no son siempre 1000 pueden ser mal loque tengo es que dividirlos de 500 en 500 saludos
Responder Con Cita
  #8  
Antiguo 12-05-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola webmasterplc.
Cita:
Empezado por webmasterplc Ver Mensaje
... lo que tengo es que dividirlos de 500 en 500 saludos
Correcto y es claro que el último lote generalmente será menor, por ejemplo:
Código Delphi [-]
var
  lotes: Integer;
  Resto: Integer;
begin
  Lotes := High(contactos) div 500;
  Resto := High(Contactos)-Lotes*500;
  ShowMessage(Format('Enviando %d lotes de 500 mensajes%sy uno de %d',
     [Lotes,#10,Resto]));
end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #9  
Antiguo 02-07-2014
webmasterplc webmasterplc is offline
Miembro
 
Registrado: mar 2008
Posts: 274
Poder: 17
webmasterplc Va por buen camino
Retomando este hilo brother ya hice la funcion concatenar
le paso los parametros del array y me concatena bien quitando la (,) como queria
ahora solo me falta controlar que cuando recorra los primeros 500 registros haga una accion y luego retome donde quedo y continue y al llegar a 500 haga la accion y si aun hay elentos continue

algo asi como esto
Código Delphi [-]
  if tope < 500  then
  begin
    for i:= Low(contactos) to High(contactos) do
    begin
      Concatenar((Format('%s', [contactos[i]])));
      tope:=tope+1;
    end;
  end

Última edición por ecfisa fecha: 02-07-2014 a las 06:19:54. Razón: corregir problema etiquetas en WYSIWYG
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Obtener determinado dígito de un número xneox Varios 10 07-10-2012 01:43:22
Ordenar Array de Registro por campo determinado Bauhaus1975 Varios 10 01-03-2009 10:44:09
Seleccionar un numero determinado de registros de una tabla NPIdea Firebird e Interbase 8 26-11-2008 19:50:46
Convertir una cadena de palabras separadas por # en array David OOP 11 10-09-2008 15:46:09
Borrar un dato determinado de un Array. alfredosg19 Varios 5 24-03-2005 10:05:17


La franja horaria es GMT +2. Ahora son las 21:21:56.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi