DOS Error 2

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

DOS Error 2

Mensagem por Kapiaba »

Bom dia. Tente assim:

Código: Selecionar todos

// \samples\SSFLAVIO.PRG

FUNCTION NET_ARQ()

   PARAMETERS PFILE, PINDEX, PEXCLU, APELID

   PRIVATE I, INDICE1, INDICE2, INDICE3, INDICE4, INDICE5, INDICE6, INDICE7, ;
           INDICE8, LERRO

   APELID := IF( Type( 'APELID' ) # 'C', '',  APELID )
   PINDEX := IF( Type( 'PINDEX' ) # 'C', '',  PINDEX )
   PEXCLU := IF( Type( 'PEXCLU' ) # 'L', .F., PEXCLU )
   LERRO  := ST()

   SELE 0

   FOR I = 1 TO 10

      IF PEXCLU // EXCLUSIVO

         USE &PFILE NEW EXCLUSIVE ALIAS &APELID

      ELSE  // COMPARTILHADO.

         USE &PFILE NEW SHARED ALIAS &APELID

      ENDIF

      IF Used()  // ESTA EM USO

         EXIT

      ENDIF

      FORMAT( 'Tentando abrir ' + PFILE, 24, 'C' )

      INKEY( .5 )

   NEXT

   RT( LERRO )

   IF Used()

      INDICE1 := PARSE( @PINDEX )
      INDICE2 := PARSE( @PINDEX )
      INDICE3 := PARSE( @PINDEX )
      INDICE4 := PARSE( @PINDEX )
      INDICE5 := PARSE( @PINDEX )
      INDICE6 := PARSE( @PINDEX )
      INDICE7 := PARSE( @PINDEX )
      INDICE8 := PARSE( @PINDEX )

      // EU MUDARIA PARA .CDX
      SET INDEX TO &INDICE1., &INDICE2., &INDICE3., &INDICE4., &INDICE5.,    ;
                   &INDICE6., &INDICE7., &INDICE8.

   ENDIF

RETURN( Used() )
Regards, saludos.
ssflavio
Usuário Nível 2
Usuário Nível 2
Mensagens: 86
Registrado em: 10 Jul 2008 09:57
Localização: São Paulo / SP

DOS Error 2

Mensagem por ssflavio »

Jairo Maia escreveu:
ssflavio escreveu:Depois que migrei o sistema de clipper para harbour, tem ocorrido com muita frequencia o seguinte erro:

Error DBFNTX/1003 Erro de abertura: SGC_RMO6.ntx (DOS Error 2)
Verifique se esse servidor está usando recursos de economia de energia. Se estiver, desative. Servidores não podem usar recursos que deixam o HDD desligar ou ficar em soneca, no primeiro momento ocorre exatamente o que relatou, depois ao tentar novamente o HDD já acordou e dá certo. Verifique se não é isso...
Obrigado pela dica Jairo!
nunca imaginei que iria encontrar uma das opções de energia com valor. DESLIGAR HD DEPOIS DE 20 MIN. Já alterei para nunca.

GRATIDÃO IRMÃO!!!
Flávio dos Santos Szelbracikowski
ssflavio@osite.com.br
ssflavio
Usuário Nível 2
Usuário Nível 2
Mensagens: 86
Registrado em: 10 Jul 2008 09:57
Localização: São Paulo / SP

DOS Error 2

Mensagem por ssflavio »

JoséQuintas escreveu:Funcionaria mesmo no Clipper, mas teria que criar a função hb_Default() no Clipper:

Código: Selecionar todos


FUNCTION NET_ARQ( cDBFName, cIndexList, lExclusive, cAlias )

   LOCAL I, lErro, cNtxName, lIndex := .F.

   hb_Default( @cAlias, "" )
   hb_Default( @cIndexList, "" )
   hb_Default( @lExclusive, .F. )
   lErro := st()

   SELECT 0
   FOR I = 1 to 10
      IF lExclusive
         IF Empty( cAlias )
            USE ( cDbfName ) EXCLUSIVE
         ELSE
            USE ( cDbfName ) EXCLUSIVE ALIAS &( cAlias )
         ENDIF
      ELSE
         IF Empty( cAlias )
            USE ( cDBFName )
         ELSE
            USE ( cDBFName ) ALIAS &( cAlias )
         ENDIF
      ENDIF
      IF used()
         EXIT
      ENDIF
      format( 'Tentando abrir ' + cDBFName, 24, 'C' )
      Inkey(1)
   NEXT

   rt( lErro )

   IF Used()
      DO WHILE ! Empty( cNtxName := Parse( @cIndexList ) )
         dbSetIndex( cNtxName )
         lIndex := .T.
      ENDDO
      IF lIndex
         SET ORDER TO 1
      ENDIF
   ENDIF

   RETURN Used()
A lista de índices, também poderia ser array, o que talvez simplificasse.
NÃO sei o que Parse() faz, provavelmente daria pra substituir por hb_RegExSplit()

Código: Selecionar todos

&( expressao )
Isso permite fazer macro do resultado da expressao, ao invés da variável diretamente.
Evita gambiarra, e no Harbour evita problemas com variáveis LOCAL.
E expande possibilidades:

Código: Selecionar todos

&( "indice" + Str( 1, 1 ) )
Caro José Quintas, muito obrigado pela atenção!
lendo o seu post, fiquei até ciom vergonha!
essa rotina está um lixo!
mas é a rotina que funcionou sempre e que nunca sofreu alteração. Ela foi escrita para Clipper em 1993 (vaz tempo eim amigão!)

agradeço a dica do hb_default(), não conhecia esta função! Vou começar a usa-la a partir de agora

quanto a função parse(), cada vez que é chamada ela retorna um string até o proxima "," e vai removendo do string original, até não ter mais nada dentro dela

Código: Selecionar todos

function PARSE(LINPUT, SEP)

local LOUTPUT, K

if SEP == NIL
   SEP := ','
endif

K := at(SEP,LINPUT)
if K > 0
   LOUTPUT := substr(LINPUT,1,K-1)
   LINPUT  := substr(LINPUT,K+1)
else
   LOUTPUT := LINPUT
   LINPUT  := ''
endif
return(LOUTPUT)
GRATIDÃO PELO ENSINAMENTO!
Flávio dos Santos Szelbracikowski
ssflavio@osite.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

DOS Error 2

Mensagem por JoséQuintas »

Se está familiarizado com array, assim retorna a lista completa de uma vez.
Vai também com uso de FOR EACH:

Código: Selecionar todos

lTemIndex := .F.
aList := hb_RegExSplit( ",", cIndexList )
FOR EACH cNome IN aList
   dbSetIndex( cNome )
   lTemIndex := .T.
NEXT
IF lTemIndex
   SET ORDER TO 1
ENDIF
Se puder atualizar pra CDX vai facilitar.
É porque com CDX, todos os índices de um DBF ficam em um único CDX, que pode ser o mesmo nome do arquivo DBF.
Acaba eliminando a lista, e nunca vai esquecer de abrir nenhum, porque fica tudo junto.

Mas isso deixa pra uma próxima etapa, pra não complicar a migração agora.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder