Upload
jamerino
View
24
Download
0
Embed Size (px)
DESCRIPTION
Curso Access 2013
Citation preview
29/10/2015 nitecAccessCdigo3
http://users.mundivia.es/afelix/Access/AccessCodigo3.htm#FuncinobtenerlaletradelNIF 1/21
Tabla Consulta Formulario Informe Macro Cdigo ActiveX Temasgenerales Volveraseleccin
29/10/2015 nitecAccessCdigo3
http://users.mundivia.es/afelix/Access/AccessCodigo3.htm#FuncinobtenerlaletradelNIF 2/21
RecipCountAsLongFileCountAsLongEndTypeTypeMapiRecipReservedAsLongRecipClassAsLongNameAsStringAddressAsStringEIDSizeAsLongEntryIDAsStringEndTypeTypeMapiFileReservedAsLongFlagsAsLongPositionAsLongPathNameAsStringFileNameAsStringFileTypeAsStringEndTypeDeclareFunctionMAPISendMailLib"MAPI32.DLL"Alias"BMAPISendMail"_(ByValSession&,ByValUIParam&,MessageAsMAPIMessage,_Recipient()AsMapiRecip,File()AsMapiFile,ByValFlags&,_ByValReserved&)AsLong
GlobalConstSUCCESS_SUCCESS=0GlobalConstMAPI_TO=1GlobalConstMAPI_CC=2GlobalConstMAPI_BCC=3GlobalConstMAPI_LOGON_UI=&H1
'*************************************************************'FUNCION:CountTokens''PROPOSITO:'Calcularlacantidaddeitemsquehayenunstring,delimitadospor'undeterminadoseparador.Utilparadimensionarunamatrizpara'almacenarindividualmentelositems,antesdellamaraParseTokens.''PARAMETROS:'sSource:Lalistadeitemsdelimitados'sDelim:ElseparadorutilizadoensSourceparadelimitarlositems''RETORNO'ElnumerodeitemsensSource.SisSourceestvacio,devuelve0.'*************************************************************FunctionCountTokens(ByValsSourceAsString,ByValsDelimAsString)DimiDelimPosAsIntegerDimiCountAsIntegerIfsSource=""ThenCountTokens=0ElseiDelimPos=InStr(1,sSource,sDelim)DoUntiliDelimPos=0iCount=iCount+1iDelimPos=InStr(iDelimPos+1,sSource,sDelim)LoopCountTokens=iCount+IIf(Right(sSource,1)=sDelim,0,1)EndIfEndFunction
'*************************************************************'FUNCION:GetToken'
29/10/2015 nitecAccessCdigo3
http://users.mundivia.es/afelix/Access/AccessCodigo3.htm#FuncinobtenerlaletradelNIF 3/21
'PROPOSITO:'Deunstringdeitemsdelimitados,devuelveelprimeroyloeliminadelalista.''PARAMETROS:'sSource:Lalistadeitemsdelimitados'sDelim:ElseparadorutilizadoensSourceparadelimitarlositems''RETORNO'sSourceesmodificado,conelprimeritemeliminado.'LafuncindevuelveelitemeliminadodesSource.'*************************************************************FunctionGetToken(sSourceAsString,ByValsDelimAsString)AsStringDimiDelimPosAsInteger'BuscaelprimerdelimitadoriDelimPos=InStr(1,sSource,sDelim)If(iDelimPos=0)ThenGetToken=trim$(sSource)sSource=""ElseGetToken=trim$(LEFT$(sSource,iDelimPos1))sSource=Mid$(sSource,iDelimPos+1)EndIfEndFunction
'*************************************************************'FUNCION:Mail''PROPOSITO:'PasalainformacindeloscamposTo,Subject,CC,Attach,yMensaje'delformularioactivoalafuncinSendMail.'CompruebaqueloscamposnoseanNULL,ysiesaslosconviertea"".'Muestratambinunmensajeindicandosielenvofueokono.'EstafuncinesactivadaporelbotnEnviardelformulario.''PARAMETROS:'Ninguno''RETORNO'Nada'*************************************************************FunctionMail()DimfAsForm,resultSetf=Screen.ActiveFormIfIsNull(f!To)Orf!To=""ThenExitFunctionIfIsNull(f!Subject)Thenf!Subject=""IfIsNull(f!CC)Thenf!CC=""IfIsNull(f!BCC)Thenf!BCC=""IfIsNull(f!Attach)Thenf!Attach=""IfIsNull(f!Message)Thenf!Message=""result=SendMail((f!Subject),(f!To),(f!CC),(f!BCC),(f!Attach),(f!Message))IfresultSUCCESS_SUCCESSThenMsgBox"Errorsendingmail:"&result,16,"Mail"ElseMsgBox"Messagesentsuccessfully!",64,"Mail"EndIfEndFunction
'*************************************************************'SUB:ParseTokens''PROPOSITO:'Extraerlositemsdeunalistadelimitadaycolocarlosenunamatriz.'
29/10/2015 nitecAccessCdigo3
http://users.mundivia.es/afelix/Access/AccessCodigo3.htm#FuncinobtenerlaletradelNIF 4/21
'PARAMETROS:'mArray():matriztipostringdeunadimensindondesecolocarnlositems.'sTokens:listadelimitadaconlositems.'sDelim:separadorutilizadoparadelimitar.''RETORNO'Nada'*************************************************************SubParseTokens(mArray()AsString,ByValsTokensAsString,ByValsDelimAsString)DimiAsIntegerFori=LBound(mArray)ToUBound(mArray)mArray(i)=GetToken(sTokens,sDelim)NextEndSub
'*************************************************************'FUNCION:SendMail''PROPOSITO:'EstaeslafuncinqueinteractadirectamenteconMAPISendMail.'Pasandoleunaslistasdelimitadaspor""deTo,CC,BCC,yadjuntos,'yunmensaje,lafuncinpreparalasestructurasMapiRecipyMapiFile'conlaayudadeParseToken.'Unavezpreparadaslasestructuras,llamaalaAPIMAPISendMailpara'enviarelmensaje.''PARAMETROS:'sSubject:EstextoqueaparecercomoAsuntodelmensaje'sTo:Listadelimitadapor""conlosdestinatariosdelmensaje.'sCC:ListadelosdestinatariosCC(Copia)'sBCC:ListadelosdestinatariosBCC(Copiaoculta)'sAttach:Listadelosficherosaadjuntaralmensaje''RETORNO'SUCCESS_SUCCESSsinohayerror,oelcdigoMAPIdelerror.'*************************************************************FunctionSendMail(sSubjectAsString,sToAsString,sCCAsString,sBCCAsString,_sAttachAsString,sMessageAsString)Dimi,cTo,CCC,cBCC,cAttach'contadoresdeitemsDimMAPI_MessageAsMAPIMessage'ContarelnmerodeitemsencadalistacTo=CountTokens(sTo,"")CCC=CountTokens(sCC,"")cBCC=CountTokens(sBCC,"")cAttach=CountTokens(sAttach,"")'DimensionarlasmatricesparalaslistasReDimrTo(0TocTo)AsStringReDimrCC(0ToCCC)AsStringReDimrBCC(0TocBCC)AsStringReDimrAttach(0TocAttach)AsString'PasarelcontenidodelaslistasalasmatricesParseTokensrTo(),sTo,""ParseTokensrCC(),sCC,""ParseTokensrBCC(),sBCC,""ParseTokensrAttach(),sAttach,""'CrearlaestructuraMAPIRecipparaalmacenartodoslosdestinatariosReDimMAPI_Recip(0TocTo+CCC+cBCC1)AsMapiRecip'Cargarlos"TO:"enlaestructuraFori=0TocTo1MAPI_Recip(i).Name=rTo(i)MAPI_Recip(i).RecipClass=MAPI_TONexti'Cargarlos"CC:"
29/10/2015 nitecAccessCdigo3
http://users.mundivia.es/afelix/Access/AccessCodigo3.htm#FuncinobtenerlaletradelNIF 5/21
Fori=0ToCCC1MAPI_Recip(cTo+i).Name=rCC(i)MAPI_Recip(cTo+i).RecipClass=MAPI_CCNexti'Cargarlos"BCC:"Fori=0TocBCC1MAPI_Recip(cTo+CCC+i).Name=rBCC(i)MAPI_Recip(cTo+CCC+i).RecipClass=MAPI_BCCNexti'CrearlaestructuraMAPI_FileparalosadjuntosReDimMAPI_File(0TocAttach)AsMapiFile'CargarlosadjuntosenlaestructuraMAPI_Message.FileCount=cAttachFori=0TocAttach1MAPI_File(i).Position=1MAPI_File(i).PathName=rAttach(i)Nexti'LlenarloscamposdelmensajeMAPI_Message.Subject=sSubjectMAPI_Message.NoteText=sMessageMAPI_Message.RecipCount=cTo+CCC+cBCC'EnviarelmensajeSendMail=MAPISendMail(0&,0&,MAPI_Message,MAPI_Recip(),_MAPI_File(),MAPI_LOGON_UI,0&)EndFunction
Nmerosromanos
CdigoBasicOptionCompareDatabaseOptionExplicit
PublicFunctionromano(vAsVariant)AsVariant
'Traduceunnmerosiestentre1y12aromano
IfIsNumeric(v)ThenDimnumAsIntegernum=CInt(v)SelectCaseCInt(v)Case1:romano="I"Case2:romano="II"Case3:romano="III"Case4:romano="IV"Case5:romano="V"Case6:romano="VI"Case7:romano="VII"Case8:romano="VIII"Case9:romano="IX"Case10:romano="X"Case11:romano="XI"Case12:romano="XII"CaseElse:romano=""EndSelectElseromano=""EndIfEndFunction'***************************************************PublicFunctionFechaRomana(vAsVariant)AsString''Fechaconmesenformatoromano
29/10/2015 nitecAccessCdigo3
http://users.mundivia.es/afelix/Access/AccessCodigo3.htm#FuncinobtenerlaletradelNIF 6/21
IfIsDate(v)ThenFechaRomana=Day(v)&""&romano(Month(v))&""&Year(v)ElseFechaRomana=""EndIfEndFunction'***************************************************PublicFunctionHoraRomana(vAsVariant)AsString''Horaenformatoromanoredondeadoacuartosdehora
IfIsDate(v)Then'CalcularhoraDimhoraAsInteger:hora=Hour(v)
'CalcularcuartosDimminsAsStringSelectCaseCInt(Minute(v)/15)Case0:mins=""Case1:mins="y"Case2:mins="y"Case3:hora=hora+1:mins=""'mins=""Case4:hora=hora+1EndSelect
'Corregirhorahora=horaMod12Ifhora=0Thenhora=12
'ConstruirlahoraHoraRomana=romano(hora)&mins&IIf(Hour(v)>=12,"p.m.","a.m.")'PostMeridiam,AnteMeridiamElseHoraRomana=""EndIfEndFunction'***************************************************PublicFunctionNumRomano(vAsVariant)AsString''Obtieneelequivalenteromanodeunnmerodehasta4cifras
IfNotIsNumeric(v)ThenNumRomano=""ElseDimnumAsInteger:num=CInt(v)Dimn1AsInteger:n1=numMod10:num=num\10Dimn2AsInteger:n2=numMod10:num=num\10Dimn3AsInteger:n3=numMod10:num=num\10Dimn4AsInteger:n4=numMod10
Dims1AsString:s1=romano(n1)Dims2AsString:s2=Reemplazar(Reemplazar(Reemplazar(romano(n2),"X","C"),"V","L"),"I","X")Dims3AsString:s3=Reemplazar(Reemplazar(Reemplazar(romano(n3),"X","M"),"V","D"),"I","C")Dims4AsString:s4=Reemplazar(Reemplazar(Reemplazar(romano(n4),"X","~M"),"V","~D"),"I","M")
NumRomano=s4&s3&s2&s1EndIfEndFunction
Reproducirsonidos
CdigoBasicOptionCompareDatabase
29/10/2015 nitecAccessCdigo3
http://users.mundivia.es/afelix/Access/AccessCodigo3.htm#FuncinobtenerlaletradelNIF 7/21
OptionExplicit
DeclareFunctionsndPlaySoundLib"winmm"Alias"sndPlaySoundA"(ByValFileNameAsString,ByValsnd_asyncAsLong)AsLongDeclareFunctionmciSendStringLib"winmm"Alias"mciSendStringA"(ByVallpstrCommandAsString,ByVallpstrReturnStringAsAny,ByValuReturnLengthAsLong,ByValhwndCallbackAsLong)AsLong'************************************************************************************************************FunctionmyPlaySound(fichero,Tipo)DimlAsLongSelectCaseTipoCase"mp3"l=sndPlaySound(fichero,1)Case"wav"l=sndPlaySound(fichero,1)Case"mid"l=mciSendString("closemymid","",0,0)'detienemymidsiestabaenplayl=mciSendString("open"&fichero&"typesequenceraliasmymid"&Chr(0),"",0,0)l=mciSendString("playmymid","",0,0)EndSelectmyPlaySound=lEndFunction
Funcinparacalculardiferenciaentrefechas/Horas
OptionCompareDatabaseOptionExplicit
'Funcinparacalculardiferenciaentrefechas/Horas'Estainformacinseaplicaa:Access2000,Access97
'RESUMEN'Muestracmocrearseunafuncindeejemploquecalculeladiferenciaentredosfechas'dadasysepuedaespecificarelformatoconelqueobtendremoselresultado.
'Unaformadepoderobtenerladiferenciaentredosfechasesusandolafuncinpredefinida'DifFecha.Elusodeestafucninsevelimitadoalahorademostrarelresultadoobtenido,'esdecir,losresultadossepodrnobteneroenhoras,oenminutos,oendas,peronocon'unformatocombinadodetodos.'Usandolafuncinincluidasepodrobtenerladiferenciaentrelas'funcionesademsdepoderespecificarenquformatoseobtendrelresultadodeladiferencia.'Losparmetrosquesepasarnalafuncinson:'FechaIncial.'FechaFinal.'Formatodelresultado.Esteparmetropodrtomarlossiguientesvalores:'a.ConDia,formatodelresultadodia:hora:minutos'b.ConHora,formatodelresultadohora:minutos'CmocrearyusarlafuncinDifHoras()'1.Abrirlabasededatosenlaquesequierautilizarlafuncin.'2.Desdelapestaademdulos,seleccionarnuevo.'3.Insertarelsiguientecdigo:'****************************************************************************************FunctionDifHoras(FechainicioAsDate,FechaFinalAsDate,formatoAsString)AsString'FormatoConDia,ConHoraDimdblIntervalAsDoubleDimlngTotalHoursAsLongDimlngTotalMinsAsLongDimlngdaysAsLongDimlngHoursAsLongDimlngMinsAsLongDimfechaesAsStringdblInterval=Abs(FechaFinalFechainicio)
29/10/2015 nitecAccessCdigo3
http://users.mundivia.es/afelix/Access/AccessCodigo3.htm#FuncinobtenerlaletradelNIF 8/21
lngdays=Int(CSng(dblInterval))lngTotalHours=Int(CSng(dblInterval*24))lngTotalMins=Int(CSng(dblInterval*1440))'DeterminalasfraccionesdetiempolngHours=lngTotalHoursMod24lngMins=lngTotalMinsMod60SelectCaseformato'CalculanmerodehorasCase"ConHora"fechaes=lngTotalHours&":"&Format$(dblInterval,"nn")'CalculaennmerodedasCase"ConDia"fechaes=lngdays&"das"&lngHours&"Horas"&lngMins&"Minutos"
EndSelectDifHoras=fechaesEndFunction
'4.Guardarydarlenombrealmdulo.
Funcinparacalculardiferenciaentrefechas
OptionCompareDatabaseOptionExplicit
'Funcinparacalculardiferenciaentrefechas'Estainformacinseaplicaa:Access2000,Access97
'RESUMEN'Muestracmocrearseunafuncindeejemploquecalculeladiferenciaentredosfechas'dadasysepuedaespecificarelformatoconelqueobtendremoselresultado.
'Unaformadepoderobtenerladiferenciaentredosfechasesusandolafuncinpredefinida'DifFecha.Elusodeestafucninsevelimitadoalahorademostrarelresultadoobtenido,'esdecir,losresultadossepodrnobteneroenhoras,oenminutos,oendas,peronocon'unformatocombinadodetodos.'Usandolafuncinqueincluidaposteriormentesepodrobtenerladiferenciaentrelas'funcionesademsdepoderespecificarenquformatoseobtendrelresultadodeladiferencia.'Losparmetrosquesepasarnalafuncinson:'FechaIncial.'FechaFinal.'Formatodelresultado.Esteparmetropodrtomarlossiguientesvalores:'a.ConDia,formatodelresultadodia:hora:minutos:segundos'b.ConHora,formatodelresultadohora:minutos:segundos'c.ConMin,formatodelresultadominutos:segundos'd.ConSeg,formatodelresultadosegundos.'CmocrearyusarlafuncinDarFecha()'1.Abrirlabasededatosenlaquesequierautilizarlafuncin.'2.Desdelapestaademdulos,seleccionarnuevo.'3.Insertarelsiguientecdigo:'************************************************************************************FunctionDarFecha(FechainicioAsDate,FechaFinalAsDate,formatoAsString)AsString'FormatoConDia,ConHora,ConMin,ConSegDimdblIntervalAsDoubleDimlngTotalHoursAsLongDimlngTotalMinsAsLongDimlngTotalSecsAsLongDimlngdaysAsLongDimlngHoursAsLongDimlngMinsAsLongDimlngSecsAsLong
29/10/2015 nitecAccessCdigo3
http://users.mundivia.es/afelix/Access/AccessCodigo3.htm#FuncinobtenerlaletradelNIF 9/21
DimfechaesAsStringdblInterval=Abs(FechaFinalFechainicio)lngdays=Int(CSng(dblInterval))lngTotalHours=Int(CSng(dblInterval*24))lngTotalMins=Int(CSng(dblInterval*1440))lngTotalSecs=Int(CSng(dblInterval*86400))'DeterminalasfraccionesdetiempolngHours=lngTotalHoursMod24lngMins=lngTotalMinsMod60lngSecs=lngTotalSecsMod60SelectCaseformato'Calculanmerototaldesegundos.Case"ConSeg"fechaes=lngTotalSecs&"Segundos"'CalculaelnmerodeminutosysegundosrestantesCase"ConMin"fechaes=lngTotalMins&":"&Format$(dblInterval,"ss")&"Minutos:Segundos"'CalculanmerodehorasCase"ConHora"fechaes=lngTotalHours&":"&Format$(dblInterval,"nn")&":"&Format$(dblInterval,"ss")&"H:M:S"'CalculaennmerodedasCase"ConDia"fechaes=lngdays&"das"&lngHours_&"Horas"&lngMins&"Minutos"&_lngSecs&"Seconds"EndSelectDarFecha=fechaesEndFunction
'4.Guardarydarlenombrealmdulo.
Cdigosparabotones
Podemosaadiranuestraaplicacinunmodulogenricoparaelcontroldelamayoradenuestrosbotones.
OptionCompareDatabaseOptionExplicit
PrivatebuttonPressedAsBoolean
'Desplazaelbotn50pxeleshaciaabajo
PublicFunctionbuttonDown(iconoAsControl)IfNotbuttonPressedThenicono.TOP=icono.TOP+50icono.LEFT=icono.LEFT+50buttonPressed=TrueEndIfEndFunction
'Desplazaelbotn50pxeleshaciaarriba
PublicFunctionbuttonUp(iconoAsControl)IfbuttonPressedThenicono.TOP=icono.TOP50icono.LEFT=icono.LEFT50buttonPressed=FalseEndIfEndFunction
'Aadirnuevoregistro
29/10/2015 nitecAccessCdigo3
http://users.mundivia.es/afelix/Access/AccessCodigo3.htm#FuncinobtenerlaletradelNIF 10/21
PublicFunctionbuttonNew()DimFAsForm:SetF=Screen.ActiveFormIfNotF.NewRecordThenDoCmd.RunCommandacCmdRecordsGoToNewEndIfEndFunction
'BotnCancelar
PublicFunctionbuttonCancel()SendKeys"{ESC}"EndFunction
'Borrarregistro,soloborraregistrosguardadosenlaBD,modificandounpocoelcdigopodemoshacerquesirva'tambinparacancelarnuevosregistros
PublicFunctionbuttonErase()OnErrorGoToErr_ComandoBorrarDimFAsForm:SetF=Screen.ActiveForm
IfNotF.NewRecordAndvbYes=MsgBox("Borrarregistro?",vbQuestion+vbYesNo+vbDefaultButton2,"Confirmar")ThenDoCmd.SetWarningsFalseRunCommandacCmdSelectRecordRunCommandacCmdDeleteDoCmd.SetWarningsTrueEndIfExit_ComandoBorrar:ExitFunctionErr_ComandoBorrar:MsgBoxErr.Description,vbCriticalResumeExit_ComandoBorrarEndFunction
'Cerrarformularioactivo
PublicFunctionbuttonClose()'DimfAsForm:f=Screen.ActiveForm'DoCmd.CloseacForm,f.NameDoCmd.RunCommandacCmdCloseWindowEndFunction
'Salirdelaaplicacin
PublicFunctionbuttonExit()IfvbYes=MsgBox("Salirdelprograma?",vbQuestion+vbYesNo+vbDefaultButton2,"Confirmar")ThenDoCmd.QuitacQuitSaveAllEndIfEndFunction
FuncinparaguardartodaslasconsultasdenuestraMDBenmodoSQLenunficherodetexto
Anivelexplotacin:Ejecutaaccionesmasivascontablasaunavelocidadsorprendente
Escompatibleconotrosmotoresdebasesdedatos.
Hacequevariastablasfuncionenjuntas,enmuchoscasos,comosifueranunasola
yestanfcildereutilizarcomoescribirenelblocdenotas!
a.Consultasdeunasolatabla:filtrosysql
Cuandoaunatablaoconsultaenpresentacinhojadedatoslediseamosunfiltro,en2.0aparecelapantalladediseodelfiltroquefuncionaigualquelapantalladediseodelaconsulta,ysipulsamosenelbotnGUARDARrealmenteguardaunaconsulta,osipulsamosenCARGARfiltrodesdeconsultaobtenemoslarelacindeconsultasaplicablescomofiltro.
29/10/2015 nitecAccessCdigo3
http://users.mundivia.es/afelix/Access/AccessCodigo3.htm#FuncinobtenerlaletradelNIF 11/21
b.Mododever:Diseo,Hojadedatos,Sql
Diseoeselmodopredeterminadoparanuevaconsulta.ParacomprobarsusresultadospasamosaEjecutarconsulta,loquenosllevaaHojadedatos(resultados).ParaaprenderSqlpodemosconfrontarlosotrosdosmodosdeverconelmodoSql.
c.MododeverSQL:sugerencias
Copiadeseguridad:mantenerabiertodefondoelblocdenotasoprocesadorSeleccionartextoSQL,Copiar,cambiaralblocoprocesador,pegar.GuardareldocumentoconelSQLunavezpegado.SimplificarElsqlautomaticoquegeneraaccessresultafarragoso:simplificando,sermslegibleydepasoexperimentamos.Encasodefallos,recuperamoseloriginaldeldocumentoqueguardamos.EnconsultassimplesnoesnecesarioprecederloscamposdelalistadeSELECTconelnombredelatablaalaquepertenecen)usaduneditor(comowordpad)confuncin"reemplazar".Ejemplo:paracambiarvarioscamposdeltipocompras.artculo>artculo,compras.precio>precio,compras.importe>importe...podemosbuscarcompras.yreemplazarpornada(dejarenblanco)Verificarcadareemplazo(reemplazandotodo,puedequenosreemplacealgoimprevisto)
Anivelprogramacin:MuchasfuncionesdeVisualBasicparaAccessrequierenSQL
DAOySQLestnntimamenteligados.
ejemploconsultadiseoysql:pasoapaso,simplificarymodificaryparaincluirencodigo
a.FuncinparaguardartodaslasconsultasdenuestraMDBenmodoSQLenunficherodetexto(sustituyeloselementosenrojosegntupathytubasededatos)
FunctionExportarQuerydefs()Open"c:\chi\cw20\prueba.txt"ForOutputAs#1DimdbAsDatabase,qdAsQueryDef,msgAsStringDimfinAsString*2,iAsInteger,jAsIntegerfin=Chr$(13)&Chr$(10)'valeusarconstantesvbAJ
Print#1,"Querydefscw20.mdb"msg="Querydefscw20.mdb"&finSetdb=CurrentDB()Forj=0Todb.Querydefs.Count1Setqd=db.Querydefs(j)msg=msg&qd.Name&fin'porsiquieresverlistaQdf'sPrint#1,qd.NamePrint#1,qd.sqlPrint#1,""NextjMsgBoxmsg'verlistaQdf'sdb.CloseClose#1EndFunction
Crearregistrosdeprueba
DurantemislaboresdesoportehecomprobadoqueconformeelconsultanteseplanteaunusodeAccessmsprofesional...selecrealanecesidaddehacerpruebasderendimiento:
Unnmeromuyelevadoderegistrospuedellegaraseruninconveniente
(...PEROdependiendomuchodecmosemanejen)
Entalcaso,resultacmododisponerdeunmtodocomoelsiguiente,paraobtenerunnmeroimportantederegistrosconlosqueefectuarpruebas,biendevolumenobiendevelocidad,sobreunatablacualquieraqueacabamosdedisearyestvaca
Estepequeofragmentoesun'motor'suficientepara'arrancar'
FunctionAleatu(inf,sup)
aleatu=Int((supinf+1)*Rnd+inf)
EndFunction
ElmotorAleatunogeneravaloresnicoscosaqueesdeagradecersalvoparaclavesnicas:Paraestecasoreservamoselprimercampodelatablafields(0)
SilatablaallenartieneuncampoIDautonumricocomoclavenica,noslogeneraJETautomticamente.
Siestenoesnuestrocaso,alaplicarelcdigo,elcampo1quedaenblancoamenosquemodifiquemosloslimitesdelbucleforb=1...porforb=0...
29/10/2015 nitecAccessCdigo3
http://users.mundivia.es/afelix/Access/AccessCodigo3.htm#FuncinobtenerlaletradelNIF 12/21
Functionengorda2()
DimdbAsDatabase,rsAsRecordset,i,jAsInteger,dAsDouble,bAsByte
Constmxint=32000
Constmxlng=2000000000
Setdb=CurrentDb
'sustituirCostesConveniosporlatablaaengordar
Setrs=db.OpenRecordset("CostesConvenios",2)
j=rs.Fields.Count1
Ford=1ToInputBox("ndeRegistros","Aadirregistrosaleatorios",50000)
rs.AddNew
Forb=1Toj'0=ID
SelectCasers.Fields(b).Type
CasedbInteger
rs.Fields(b)=aleatu(1,mxint)
CasedbLong,dbDouble
rs.Fields(b)=aleatu(1,mxlng)
CasedbText
rs.Fields(b)=v3(rs,b)'verdebajo
Casedbdate
'Clng(#1/1/90#)=32874,Clng(#31/12/99#)=36525
rs.Fields(b)=CDate(aleatu(32874,36525))
CaseElse
Stop
EndSelect
Next
rs.Update
Next
MsgBox"fin"
EndFunction
Explicacindelafuncinv3,querellenaloscamposdetextoconcaracteresasciicomprendidosentre65y90
ElcampoDETEXTOtienetalTAMAO...
llamarafuncinaleatu(elmotor)paraquedevuelvanumerodecaracteresarellenar(entre0ytamao)
tantasvecescomocaracteresarellenar:aadircarcterentre65y90acadenaadevolver(tambinmediantelaoportunallamadaaaleatuofcourse).
Elnuevofragmentitodecdigo
Functionv3(rst,numerocampo)AsString
'acepta:rst(recordset)(cuyo)numerocampo(esuncampotexto)
'devuelve:unacadenaconlacualrellenamoselcampodetexto>rst(numerocampo)
DimlongitAsByte
longit=rst.Fields(numerocampo).Size1
29/10/2015 nitecAccessCdigo3
http://users.mundivia.es/afelix/Access/AccessCodigo3.htm#FuncinobtenerlaletradelNIF 13/21
'lacantidadminimadecaracteresconquerellenaresecampoes0
'lacantidadmxima,longit
DimrellenarAsByte
'establecerunnmeroaleatoriodecaracteresarellenar
rellenar=aleatu(0,longit)
DimnAsByte,cadenaAsString
Forn=0Torellenar
'montarlacadenaquerellenarelcampotexto
'porejemplomayusculasdelaA(65)alaZ(90)
cadena=cadena&Chr(aleatu(65,90))
Next
v3=cadena
EndFunction
Mejoras:Barradeprogresoymensajedetiempotranscurrido
Functionv2()
DimtAsDate:t=Time'contartiempotranscurrido
DimNRAsLong:NR=500000'numeroderegistros
DimIAsLong
DimNADA
'ensearmsgeiniciarbarraStatus
NADA=SysCmd(acSysCmdInitMeter,"progreso",NR)
ForI=0ToNR'bucleregistros
NADA=SysCmd(acSysCmdUpdateMeter,I)'actualiza
NextI
NADA=SysCmd(acSysCmdRemoveMeter)'elimina
t=Timet:MsgBox"terminadoen:"&t
EndFunction
Deunaspequeasnecesidades,graciasalareusabilidaddelcdigo,aratosmsomenosperdidos,casicualquiercosapuedellegaraconvertirseenunaherramienta.
Ponermaysculaslaprimeraletrayminsculaselresto
PublicFunctionCapitalizar(ByValtextoAsString)AsString
Capitalizar=UCase(LEFT(texto,1))&LCase(Mid(texto,2))EndFunction
Ponermaysculaslaprimeraletrayminsculaselrestoconexcepciones
PublicFunctionMultiCap(textoAsVariant)AsVariant'Capitalizavariaspalabrascontemplandoalgunasexcepciones
DimtempAsVariantDimiAsIntegerDimansiAsInteger
temp=LCase(texto)'Empezarenminsculas
IfLen(temp)>0Then'Novaco
29/10/2015 nitecAccessCdigo3
http://users.mundivia.es/afelix/Access/AccessCodigo3.htm#FuncinobtenerlaletradelNIF 14/21
Mid(temp,1,1)=UCase(LEFT(temp,1))'1romaysculasFori=2ToLen(temp)1ansi=asc(Mid(temp,i,1))If(ansi>=65Andansi=97Andansi192)Then'letrasmaysculas,minsculasyacentuadasElseMid(temp,i+1,1)=UCase(Mid(temp,i+1,1))EndIf
'CASOSESPECIALES*****'SiesapstrofeponerenminsculaselanteriorIfMid(temp,i,1)="'"ThenMid(temp,i1,1)=LCase(Mid(temp,i1,1))EndIf'*****NextEndIf
'CASOSESPECIALES*****i=InStr(temp,"S/N")Ifi0ThenMid(temp,i,3)=LCase(Mid(temp,i,3))i=InStr(temp,"De")Ifi0ThenMid(temp,i,4)=LCase(Mid(temp,i,4))
i=InStr(temp,"Del")Ifi0ThenMid(temp,i,5)=LCase(Mid(temp,i,5))
i=InStr(temp,"La")Ifi0ThenMid(temp,i,4)=LCase(Mid(temp,i,4))i=InStr(temp,"Y")Ifi0ThenMid(temp,i,3)=LCase(Mid(temp,i,3))'*****
MultiCap=temp
EndFunction
Funcinobtenersemana
PublicFunctionObtenerSemana(diaSemanaAsInteger)AsStringStaticsemana(1To7)AsStringsemana(1)="Domingo"semana(2)="Lunes"semana(3)="Martes"semana(4)="Mircoles"semana(5)="Jueves"semana(6)="Viernes"semana(7)="Sbado"IfdiaSemana>=1AnddiaSemana
29/10/2015 nitecAccessCdigo3
http://users.mundivia.es/afelix/Access/AccessCodigo3.htm#FuncinobtenerlaletradelNIF 15/21
Fori=0Tofrm.count1Setctrl=frm(i)Ifctrl.Section=acDetailThen'SECCINDETALLE=0If(TypeOfctrlIsTextBox)Or(TypeOfctrlIsComboBox)Or_(TypeOfctrlIsListBox)Or(TypeOfctrlIsOptionButton)_ThenIfctrl.SpecialEffect=BAJO_RELIEVEThenctrl.BackColor=colorctrl.Locked=estadoBloqueoEndIfElseIfTypeOfctrlIsSubFormThenSetsubfrm=ctrlCallBloquearControles(subfrm,estadoBloqueo)EndIfEndIfNext
EndSub
Corregirhipervnculodecorreoelectrnico
PublicSubCorregirCorreo(cAsTextBox)'Alintroducirunhipervnculodecorreoelectrnico,'Accesssepiensaqueesdeweb.Despusdeactualizarelcampo'esteprocedimientoescapazdecorregireldesaguisado.
OnErrorGoToErr_CorregirCorreoDimvAsStringDimiAsIntegerv=ci=InStr(v,"http://")Ifi0ThenMid(v,i,7)="mailto:"c=vEndIfExit_CorregirCorreo:ExitSubErr_CorregirCorreo:MsgBoxErr.Description,vbCriticalResumeExit_CorregirCorreoEndSub
Correoobtienelacadenadelhipervnculo
PublicFunctionElectrograma(OptionalvAsVariant="")AsVariant'Obtienelacadenadelhipervinculo
OnErrorGoToError_Electrograma'DiminteractivoAsBoolean'interactivo=False'IfIsNull(v)Then'v=InputBox("Introduceunhipervnculo",,"textodelantero#mailto:[email protected]#")'interactivo=True'EndIf
DiminicioAsIntegerDimfinAsIntegerinicio=InStr(v,"#mailto:")+8fin=InStr(inicio,v,"#")Electrograma=Mid(v,inicio,fininicio)'IfinteractivoThen'MsgBox"Elcorreoes:"&Electrograma,vbInformation'EndIfExit_Electrograma:ExitFunctionError_Electrograma:
29/10/2015 nitecAccessCdigo3
http://users.mundivia.es/afelix/Access/AccessCodigo3.htm#FuncinobtenerlaletradelNIF 16/21
'MsgBoxError,vbCriticalElectrograma=vResumeExit_Electrograma
EndFunction
FuncinobtenerlaletradelNIF
Estafuncindevuelvelaletracorrespondientealdnipasadocomoargumento.Eldnidebeserunnmeroenterolargo.Encasodequenoseencuentrelaletra,lafuncindevuelvelacadena"Error".
PublicFunctionLetraNIF(dniAsLong)AsString
DimtmpAsLong
tmp=dni(Int(dni/23)*23)
SelectCasetmp
Case0,23:LetraNIF="T"
Case1:LetraNIF="R"
Case2:LetraNIF="W"
Case3:LetraNIF="A"
Case4:LetraNIF="G"
Case5:LetraNIF="M"
Case6:LetraNIF="Y"
Case7:LetraNIF="F"
Case8:LetraNIF="P"
Case9:LetraNIF="D"
Case10:LetraNIF="X"
Case11:LetraNIF="B"
Case12:LetraNIF="N"
Case13:LetraNIF="J"
Case14:LetraNIF="Z"
Case15:LetraNIF="S"
Case16:LetraNIF="Q"
Case17:LetraNIF="V"
Case18:LetraNIF="H"
Case19:LetraNIF="L"
Case20:LetraNIF="C"
Case21:LetraNIF="K"
Case22:LetraNIF="E"
CaseElse:LetraNIF="Error"
EndSelect
EndFunction
UsoenAccess
Primerodebesescribirlafuncin.SilainsertasenlaseccinMdulosdelaventanadelabasededatos,serpblicaparatodosloselementos(sepodrusarentodoslosformularios,informesyconsultas).
Crea,enunformulariooenuninforme,uncampodetextoindependiente.Siesenunformulario,asignaasuspropiedadesActivadoyBloqueado,losvaloresNoyS,respectivamente,paraqueelusuarionopuedamodificarelvalor.
29/10/2015 nitecAccessCdigo3
http://users.mundivia.es/afelix/Access/AccessCodigo3.htm#FuncinobtenerlaletradelNIF 17/21
Seguidamente,ensupropiedadOrigendelcontrol,dalelasiguientefrmula:
=LetraNIF([campo])
DondecampoeselcampodelatabladedondesevaarecogerelDNI.Silatablaoelcamponosehanrecogidoenelformulariooenelinformedirectamente,debersindicarloas:
=LetraNIF([Tabla]![campo])
Silaintroducesenunaconsulta,enCampoescribelosiguiente:
Nombre:LetraNIF([campo])
DondeNombreeselnombredelnuevocampodondesevaa"guardar"laletradelDNI,ycampoelcampodedondeserecogeelDNI.Silatablaalaqueperteneceoelcamponosehanrecogidoenlaconsulta,debersindicarelnombredelatabla:
Nombre:LetraNIF([Tabla}![campo])
Porltimo,siquieresqueteaparezcaelnifcompleto(dni+letra),introducelosiguienteenlaconsulta,formulariooinforme:
[campo]&LetraNIF([campo])
Contadorpersonalizado
OptionExplicit
FunctionMicontador()
DimdbAsDatabase,CUSTAsTable,INTERN,TEMP
Setdb=CurrentDb()
SetCUST=db.OpenTable("Clientes")
CUST.Index="PRIMARYKEY"
INTERN=2
CUST.Seek">=",INTERN
TEMP=CUST![CODI]
DoWhileTEMP=INTERN
INTERN=CUST![CODI]
INTERN=INTERN+1
CUST.Seek">=",INTERN
IfCUST.NoMatchThen
TEMP=0
Else:TEMP=CUST![CODI]
EndIf
Loop
Micontador=INTERN
CUST.Close
EndFunction
Verimgenessinguardarlasenunabasededatos
'Estafuncinvadedicadaatodasaquellaspersonasquedeseanverimgenesenunformulariooinforme,sintenerqueguardarlasen'labasededatosparanoincrementarendemasiadosutamao.
'Elejemplosevaaexplicarsobreunformulario,parapoderimplementarlaposibilidaddecambiaroagregarunaimagen.Enun'informe,lonicoquehayquehaceresomitiresaparte.
'Crearlatabla
29/10/2015 nitecAccessCdigo3
http://users.mundivia.es/afelix/Access/AccessCodigo3.htm#FuncinobtenerlaletradelNIF 18/21
'Supongamosquetenemosunabasededatosdondeseguardalainformacindeunaseriedepersonas.
'Cmonosabemosquinesson,deseamosguardarunafotosuyaparareconocerloscadavezqueveamossusdatos.Conlocual,'creamosunatablaconlossiguientescampos:
'idAutonumricoSerelcampoclavedelatabla.
'NombreTextoGuardarelnombreylosapellidosdecadapersona.
'RutaImagenTexto255Contendrlarutaynombredelarchivogrfico.
'Latablapuedecontenertodoslosdatosquesedeseeparaestafuncinelnico
'imprescindibleesrutaImagen.Selehadadounalongitudde255caracteres(lamximapermitida)
'aunquedependiendodelsistemasobreelcualsetrabaje,sepodrareducirestalongitud.
'Hayqueadvertirquesiseabrelatablaenmodonormal,noseverningunaimagen
'tanslolarutadestaenelrboldedirectoriosdelordenador.
'Crearelformulario
'Ahoraseprocedeacrearelformulario.Sepuedeutilizarunasistente,ocrearloapelodaigual,lacuestinesquesuorigenseala'tablaquehemoscreadoanteriormente
'SisehautilizadoelAsistente,tendrsloscamposbasadosenlatabla.
'Puesbien,ahorahayqueaadirunbotn,paraqueelusuariopuedabuscarlaimagen
'quedesee,uncontrolImagenparapodervisualizarlaimagenyuncontrolCommonDialogpara
'quesalgalaventanadeAbrirarchivo.
'NoencuentraselcontrolCommonDialog?VeaInsertar|Controlespersonalizados,
'yhayteaparecerunalistacontodosloscontrolesquepuedesagregaratuformulario.
'Elquebuscamossellama"MicrosoftCommonDialogControl,versionx.x".Loseleccionas
'ypulsasAceptar.Cuandolohayasinsertado,teapareceruniconodentrodelformulario.
'Djaloenunlugardelformulariodondenotemoleste,ynotepreocupesporsu
'visualizacin(Cuandoabraselformularioenmodonormal,noseverestecontrolporningunaparte).
'SielcontrolImagentevuelveloco,porquetepideunaimagenparapoderinicializarse
'pinchaenunacualquieray,unavezcreado,qutasela.
'Yacontinuacin,laspropiedadesquevamosadaraestostrescontrolesquehemosaadido:
'ControlImagenNombre:picGrafico
'Tipodeimagen:Vinculado
'ControlBotnNombre:btnRutaImagen
'Ttulo:...
'ControlCommonDialog:Nombre:cmmDialogo
'Loscontrolesbasadosenlatablalosdejamosconlaspropiedadesqueleshayadado
'elAsistente.SinoloshemoscreadoconelAsistente,selesdaelmismonombrequeeldesucampodeorigen.
'Insertarelcdigo
'LosiguienteescrearelcdigoenVBAnecesarioparatrabajarconimgenes.
'Secrearparapoderhacerlosiguiente:
'Visualizarlaimagencuandosecargueunregistroguardado.
'Cargarunanuevaimagen.
29/10/2015 nitecAccessCdigo3
http://users.mundivia.es/afelix/Access/AccessCodigo3.htm#FuncinobtenerlaletradelNIF 19/21
'Paraello,vealmenVer|Cdigo,einsertaelsiguientecdigo:
PrivateSubForm_Current()
DimmsgAsString
OnErrorGoToerrForm_Current
'Sedescargaelgraficoanterior
picGrafico.Picture=""
'Sihaylarutadeunaimagenguardada,semuestra
IfLen(rutaImagen)>0Then
picGrafico.Picture=rutaImagen
Else
'Aquisepuedeindicarquecargueunaimagenpordefecto:
'Ellogodeunaempresa,unafoto,etc.
EndIf
ExitSub
errForm_Current:
SelectCaseErr
Case52To76'Erroresdeentrada/salida
msg="Nosepudocargarelarchivoindicado."
Case481'Erroresconelformato
msg="Elarchivonotieneunformatovalido."
CaseElse'Otroserrores
msg="Ocurriunerroralabrirelarchivo."
EndSelect
msg=msg&vbCrLf&"Porfavor,compruebeelarchivo."
msg=msg&vbCrLf&"Debeserunarchivograficoy"
msg=msg&"accesibledesdelabasededatos."
msg=msg&vbCrLf&Err.Number&":"&Err.Description
MsgBoxmsg,vbExclamation,"Errorconarchivografico"
EndSub
PrivateSubbtnRutaImagen_Click()
DimfiltroAsString
DimmsgAsString
OnErrorGoToerrbtnRutaImagen_Click
'Secarganlasextensionesposiblesdearchivosgrficos
filtro="Todoslosarchivos(*.*)|*.*|"
filtro=filtro&"Todoslosarchivosgraficos|*.jpg*.pcd"
filtro=filtro&"*.gif*.drm*.pct*.hgl*.plt*.wpg"
filtro=filtro&"*.cdr*.cgm*.dxf*.wmf*.bmp*.eps"
filtro=filtro&"*.tif*.pcx*.ico*.dib*.emf|"
filtro=filtro&"Mapasdebits(*.bmp*.dib)|*.bmp*.dib|"
filtro=filtro&"Metaarchivos(*.wmf*.emf)|*.wmf*.emf|"
29/10/2015 nitecAccessCdigo3
http://users.mundivia.es/afelix/Access/AccessCodigo3.htm#FuncinobtenerlaletradelNIF 20/21
filtro=filtro&"ArchivosdePaintbrush(*.pcx)|*.pcx|"
filtro=filtro&"Iconos(*.ico)|*.ico|"
filtro=filtro&"ArchivosTIF(*.tif)|*.tif|"
filtro=filtro&"PostScriptencapsulado(*.eps)|*.eps|"
filtro=filtro&"Formato2DdeAutoCad(*.dxf)|*.dxf|"
filtro=filtro&"Metaarchivogrfico(*.cgm)|*.cgm|"
filtro=filtro&"ArchivosdeCorelDraw(*.cdr)|*.cdr|"
filtro=filtro&"GraficosdeWordPerfect(*.wpg)|*.wpg|"
filtro=filtro&"GraficosHP(*.hgl*.plt)|*.hgl*.plt|"
filtro=filtro&"ArchivosdeMacintosh(*.pct)|*.pct|"
filtro=filtro&"MicrografxDesigner/Draw(*.drw)|*.drw|"
filtro=filtro&"GIFCompuServe(*.gif)|*.gif|"
filtro=filtro&"KodakPhotoCD(*.pcd)|*.pcd|"
filtro=filtro&"ArchivosJPEG(*.jpg|*.jpg"
cmmDialogo.Filter=filtro
cmmDialogo.FilterIndex=2
'SecarganotraspropiedadesdelCommonDialog
cmmDialogo.CancelError=True
cmmDialogo.DialogTitle="Cargararchivografico"
'Sitenemosunaimagenenelformulario,secogesuruta
'paramostrarlainicialmenteenlaventanaAbrir.
IfLen(rutaImagen)>0Then
cmmDialogo.FileName=rutaImagen
EndIf
cmmDialogo.ShowOpen
'Siel/lausuario/aseleccionounaimagen,secomprueba
'quelalongitudderutaynombrenosobrepaselos255
'caracteres,yaquenoseguardariabienenlaBD
IfLen(cmmDialogo.FileName)>255Then
msg="Larutadelarchivoesmayorde255caracteres."
msg=msg&vbCrLf&"Siintentarecogerestaimagen,"
msg=msg&"surutaseveratruncada"
msg=msg&vbCrLf&"ynopodrvisualizarladespus."
msg=msg&vbCrLf&"Deseacargarladetodosmodos?"
IfMsgBox(msg,vbQuestion+vbYesNo,_
"Longituddelnombredearchivosuperada")=_
vbNoThen
ExitSub
EndIf
EndIf
'Secargalaimagen
29/10/2015 nitecAccessCdigo3
http://users.mundivia.es/afelix/Access/AccessCodigo3.htm#FuncinobtenerlaletradelNIF 21/21
picGrafico.Picture=cmmDialogo.FileName
rutaImagen=cmmDialogo.FileName
ExitSub
errbtnRutaImagen_Click:
SelectCaseErr
CasecdlCancel'ElusuariopulsoCancelar
ExitSub
Case52To76'Erroresdeentrada/salida
msg="Nosepudocargarelarchivoindicado."
Case481'Erroresconelformato
msg="Elarchivonotieneunformatovalido."
CaseElse'Otroserrores
msg="Ocurriunerroralabrirelarchivo."
EndSelect
msg=msg&vbCrLf&"Porfavor,compruebeelarchivo."
msg=msg&vbCrLf&"Debeserunarchivograficoy"
msg=msg&"accesibledesdelabasededatos."
msg=msg&vbCrLf&Err.Number&":"&Err.Description
MsgBoxmsg,vbExclamation,"Errorconarchivografico"
picGrafico.Picture=rutaImagen
EndSub
'As,cuandosevayaaunregistro,seactivareleventoAlactivarregistro,
'quellamaralprocedimientoPrivateSubForm_Current()quehemoscreado,cargandolaimagen,
'siesquehayunareferenciaaella(cuandosevayaaunregistronuevo,noocurrenada).
'Encasodequeseproduzcaunerror,nosaparecerunmensajedeerrorynose
'mostrarningunaimagen.
'Despus,cuandosepulsesobreelbotn,sevisualizarunaventanaparaseleccionar
'laimagendeseada,quesecargarenelcontrolImagensinoocurreningnerror.